[java][c++]Aplikacja klient serwer

0

witam,
nie byłem pewien gdzie wrzucić ten temat bo aplikację piszę w dwóch językach - klient w javie i serwer w c++, ale problem dotyczy raczej części w javie więczamieszczam tu.
Nigdzie nie mogę znaleźć żadnych informacji o różnicach w jaki sposób java i c++ przesyłają dane więc opieram się na metodzie prób i błędów(jakby ktoś znał dobre źródło to będę wdzięczny za podzielenie się nim). A więc, wygląda to tak: klient przesyła string login do serwera, ten go odbiera i wysyła char[] z potwierdzeniem odbioru. I tu się zaczynają schody. Bo o ile serwer login odbiera to przy odbieraniu potwierdzenia klient wysypuje się. O ile udało mi się wyłapać, że java przesyła jakieś liczby kontrolne na początku przesyłanej danej, tak tu niewiele mogę wymysleć. Macie jakiś pomysł?
Kod serwera:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int main(void) {
	unsigned int port =10002;
	char bufor[1024];
	int gniazdo, gniazdo2;
	struct sockaddr_in adr, nadawca;
	socklen_t dl = sizeof(struct sockaddr_in);
	gniazdo = socket(PF_INET, SOCK_STREAM, 0);
	adr.sin_family = AF_INET;
	adr.sin_port = htons(port);
	adr.sin_addr.s_addr = INADDR_ANY;
	if (bind(gniazdo, (struct sockaddr*) &adr, sizeof(adr)) < 0) {
		printf("Bind nie powiodl sie.\n");
		return 1;
	}
	if (listen(gniazdo, 10) < 0) {
		printf("Listen nie powiodl sie.\n");
		return 1; 
	}
	printf("Czekam na polaczenie ...\n");

	while ((gniazdo2 = accept(gniazdo,(struct sockaddr*) &nadawca, &dl)) > 0) 
	{
		memset(bufor, 0, 1024);
		recv(gniazdo2, bufor, 2, 0);// java przesyła dodatkowe śmieci
		memset(bufor, 0, 1024);
		recv(gniazdo2, bufor, 1024, 0);
		printf("Wiadomosc od %s: %s\n",inet_ntoa(nadawca.sin_addr), bufor);
		char msg[1024] = "Login przyjęty";
		send(gniazdo2, msg, strlen(msg), 0);
		printf("Wysłano potwierdzenie otrzymania loginu");
		close(gniazdo2);
	}
	close(gniazdo); 
	return 0; 
}

Kod klienta:


package JTMClient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class JTMClient {
    public String login="$ja";

    public void run() throws UnknownHostException, IOException, ClassNotFoundException {
            String addrString = "127.0.0.1";
            String portString = "10002";
            InetAddress server_addr = InetAddress.getByName(addrString);
            int port = Integer.parseInt(portString);
            Socket socket = new Socket(server_addr, port);
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //do serwera
            DataInputStream dis = new DataInputStream(socket.getInputStream()); //od serwera
            String loginRun = getLogin();
            // zapisz ko    lejno int, String i double
            dos.writeUTF(loginRun);
            System.out.println("wysłano login");
            //dos.writeInt(125);
            //dos.writeDouble(3.14159);

            // czytaj odpowiedz

            String s = dis.readUTF();
            System.out.print(s);
            // wypisz odpowiedz
            //System.out.println("Serwer powiedzial: "+s);
            dis.close();
            dos.close();

            // koniec rozmowy
            socket.close();

        // moga byc wyjatki dot. gniazd,
        // getByName, parseInt i strumieni

        System.out.println("Klient zakonczyl dzialanie");
    }
  private String getLogin() {
      return login;
  }
}

A oto i sam błąd:

run:
wysłano login
Exception in thread "main" java.io.EOFException
        at java.io.DataInputStream.readFully(DataInputStream.java:197)
        at java.io.DataInputStream.readUTF(DataInputStream.java:609)
        at java.io.DataInputStream.readUTF(DataInputStream.java:564)
        at JTMClient.JTMClient.run(JTMClient.java:39)
        at JTMClient.MainWindow.main(MainWindow.java:227)
BUILD SUCCESSFUL (total time: 6 seconds)

0

W dokumentacji DataInputStream i DataOutputStream masz napisane, że działają w "machine independent way" co raczej nie jest domeną c++. Na twoim miejscu zaimplemenciłbym jakieś własne Input i Output strumienie do czytania danych, żeby mieć gwarancję poprawności komunikacji i kontrolę nad danymi. Być może właśnie z tego powodu dostajesz takie a nie inne wyjąteczki. Pozdr

0

Dobra, okazało się, że String nie przyjmie charów, więc zapisuję dane wysyłane przez serwer do tablicy char. Teraz kolejny problem to to, że dostaje z tego same kwadraciki - inne kodowanie? a może przesyłają dane w innym formacie sieci?

1 użytkowników online, w tym zalogowanych: 0, gości: 1