Witam
Mam następujący problem, przy próbie wysłania prostego strumienia danych (int lub string), od klienta(java) do serwera(c). Serwer nie odbiera tych danych - jest to albo 0 dla wysyłanego int -a albo null dla Stringa. Jak poprawić poniższe kody, aby Klient wysyłał to co ja chce ??
Klient(Java)
import java.io.*;
import java.net.*;
public class Klient {
static ObjectOutputStream out;
static ObjectInputStream in;
public static void K() throws Exception {
Object dane;
char []dane2 = new char[10];
InetAddress addr = InetAddress.getByName("localhost");
try {
Socket socket = new Socket(addr, 1236);
//socket.getOutputStream().write(123);
dane = "abc";
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());
dane = in.readObject();
System.out.println(dane);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
K();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server (C)
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#define DEFAULT_PORT 1239
#define DEFAULT_BUFFER 4096
#define MAXDATASIZE 200
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock = (SOCKET)lpParam;
char szBuf[DEFAULT_BUFFER];
int ia =100;
int odba,wys,i,j;
while(1){
printf("\n ODBIERAM \n\n");
int numbytes;
int buf[MAXDATASIZE];
if ((numbytes=recv(sock, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
int cos = 0;
cos = atoi(buf);
printf("Received: %d",cos);
}
return 0;
}
int main()
{
WSADATA wsd;
SOCKET sListen,sClient;
int iAddrSize;
HANDLE hThread;
DWORD dwThreadID;
struct sockaddr_in local, client;
struct hostent *host = NULL;
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Blad Winsock 2.2!\n");
return 1;
}
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen == SOCKET_ERROR)
{
printf("Blad socket(): %d\n", WSAGetLastError());
return 1;
}
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);
if (bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
printf("Blad bind(): %d\n", WSAGetLastError());
return 1;
}
host = gethostbyname("localhost");
if (host == NULL)
{
printf("Nie udalo sie wydobyc nazwy serwera\n");
return 1;
}
listen(sListen, 8);
printf("SERWER NASLUCHUJE\n");
printf("Adres: %s, port: %d\n", host->h_name, DEFAULT_PORT);
while (1)
{
iAddrSize = sizeof(client);
sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize);
if (sClient == INVALID_SOCKET)
{
printf("Blad funkcji accept(): %d\n", WSAGetLastError());
return 1;
}
printf("Zaakceptowano polaczenie: serwer %s, port %d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient, 0, &dwThreadID);
if (hThread == NULL)
{
printf("Blad funkcji CreateThread(): %d\n", WSAGetLastError());
return 1;
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}
serwer zapożyczony od kolegi bleekm
Proszę o pomoc
update
napisałem prostszy server, i w Javie wyswietla błąd - cos o nie prawidlowym nagłówku
java.io.StreamCorruptedException: invalid stream header: 64636261
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Klient.K(Klient.java:19)
at Klient.main(Klient.java:31)
a przeciez w kodzie ASCII 64636261 to dcba czyli to co wysyłam...
oto ten server
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <string>
#define port 1236
int main(){
int blad;
WORD wersja;
WSADATA wsaData;
wersja = MAKEWORD( 2, 2 );
blad = WSAStartup(wersja, &wsaData );
if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ){
printf("error WSA");
WSACleanup();
}
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
SOCKET soc1, soc2;
if ((soc1 = socket( AF_INET, SOCK_STREAM, 0 )) == -1){
printf("\n Wystąpił bląd podczas tworzenia GNIAZDA !!! \n\n");
}else{
printf("\n GNIAZDO zostalo stworzone \n\n");
}
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(1236); // short, network byte order
my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(&(my_addr.sin_zero), '\0', 8); // wyzeruj resztę struktury
if (bind(soc1, (struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(1);
}
if(listen(soc1, 10) == -1){
printf("\n Wystąpił bląd LISTENA() !!! \n\n");system("PAUSE");
}
int sin_size,sendb;
char *dane;
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((soc2 = accept(soc1, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
perror("accept");
continue;
}
if((sendb = send(soc2,"dcba",6,0)) == -1){
perror("send");
}
}
WSACleanup();
return 0;
}
może teraz ktoś mi powie w czym robię błąd ??