2016-04-06 16 views
0

Java (Client) und C# (Server) TCP Socket. und Server lesen unendliche letzte Daten vom Client (Java) Ich habe schon den ganzen Tag gesucht, es ist komisch.Java (Client) und C# (Server) TCP-Socket. und Server lesen unendliche letzte Daten vom Client

erstellt I 2-Client: Java (real), C# (zum Testen) wie folgt aus:

Java (Real):

Socket socket = new Socket(SyncActivity.ip,SyncActivity.port); 
DataOutputStream out; 
out = new DataOutputStream(socket.getOutputStream()); 
String s = "Hello!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$"; 
out.write(s.getBytes(),0,s.getBytes().length); 
out.flush(); 
s = "Yes this another data$"; 
out.write(s.getBytes(),0,s.getBytes().length); 
out.flush(); 
socket.shutdownInput(); 
socket.shutdownOutput(); 
socket.close(); 
Thread.currentThread().interrupt(); 

und C# (zum Testen)

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
clientSocket.Connect("192.168.0.138", 11838); 
NetworkStream serverStream = clientSocket.GetStream(); 
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox2.Text + "$"); 
serverStream.Write(outStream, 0, outStream.Length); 
serverStream.Flush(); 

Auf C# (Test) -Seite, schickte eine Daten an den Server, und der Server readed die Daten einmal und blockiert, um eine andere Daten warten. (Zweite Daten gleichen wie einmal gelesen und blockiert) Ich nur wan t so.

Auf Java (Real) -Seite, schickte zwei Daten an Server und Server 1. Daten einmal lesen und lesen die gleichen 2. Daten für immer. Die Java-Seite wird nur einmal überprüft.

Es sind vollständige Daten, die ich erhalten habe. Warum? es ist komisch.

Ergebnisse als:

auf C# (testing)

Client-Anfrage-Verbindung.

Server akzeptieren und erstellt Verbindung.

Server versuchen lesen (und Blocked)

Client senden >> TextBox

Server empfangen >> TextBox

Server versuchen lesen (und Blocked)

aber auf Java (Real):

Clientanforderung verbinden Ion.

Server akzeptieren und erstellt Verbindung.

Server versuchen lesen (und Blocked)

Client senden >> Hallo !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Server empfangen >> Hallo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!

Client senden >> Ja, das weitere Daten

Server versuchen Lesen

Server >> empfangen Ja, das weitere Daten

Server versuchen Lesen

Server empfangen >> Ja, das andere Daten

Server versuchen Lesen

empfangen Server >> Ja, das weitere Daten

Server versuchen Lesen

Server >> empfangen versuchen Ja, das weitere Daten

Server

Server empfangen >> Ja Dies ist ein weiterer Daten

lesen

Server versuchen Lesen

Server empfangen >> Ja, das andere Daten

(und für immer und ewig)

Server Code:

TcpListener serverSocket = new TcpListener(IPAddress.Any, Convert.ToInt16(Ini.IniReadValue("About", "ServerPort", "MVS_VAN.info"))); 
    TcpClient clientSocket = default(TcpClient); 
    serverSocket.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
    serverSocket.Start(); 
    clientSocket = serverSocket.AcceptTcpClient(); 
    serverSocket.Stop(); 
    NetworkStream networkStream = clientSocket.GetStream(); 
    byte[] bytesFrom = new byte[128000]; 
    do 
    { 
         Socket soc = clientSocket.Client; 
         soc.Receive(bytesFrom); 
         string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
         dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
         MessageBox.Show("", dataFromClient); 
         networkStream.Flush(); 

        //networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
        //string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        //dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        //tried^this 3 line also. 

        } while ((true)); 
    clientSocket.Close(); 
    serverSocket.Stop(); 
+0

Nein, das ist nicht komisch. TCP ist ein Streaming-Protokoll. Ein 'Send()' entspricht keinem 'Receive()'. Sie müssen weiterlesen, den von "Receive()" zurückgegebenen Wert nicht ignorieren und den Puffer so lange anhängen, bis Sie wissen, dass Sie eine ganze Nachricht erhalten haben. – CodeCaster

+0

@CodeCaster Es sind vollständige Daten, die ich erhalten habe. und halten Sie es lesen Sie die gleichen Daten. Es wird in der normalen Situation blockiert, um die Daten nur einmal zu lesen. – nyconing

+0

Ja, ich habe keine Ahnung, was du damit meinst. Dieser Code ist defekt, Sie sollten keine Sockets verwenden, wenn Sie nicht wissen, was Sie tun, sondern stattdessen ein HTTP-Protokoll höherer Ebene verwenden. – CodeCaster

Antwort

-2

Im gefunden, was das Problem ist nach einem Tag zu untersuchen.

aber seine immer noch seltsam:

auf Java-Client:

socket.close();//<--here causing a start of server read same last data infinitly 

es nicht wurde es richtig schließen. vielleicht wo Protokoll ist immer noch close_wait Zustand, um sicherzustellen, dass alle Pakete auf dem Server angekommen ist?

.

gefälschte Entschlossenheit:

Im meine eigenen Befehlspakete wie „cmd_request_close_connection“ Senden an den Server schreiben, und schließen Sie die Verbindung auf Server-Seite, wenn Server-Paket wie folgt erhalten.

+0

meine eigene Antwort ist morgen selbst zu akzeptieren, wenn keine andere beste Antwort zu erklären, wie das Problem bestehen bleibt. – nyconing

+0

Das ist nicht das Problem. Das Problem ist, dass der Empfänger das Ende des Streams ignoriert. CLOSE_WAIT hat auch nichts damit zu tun, außer dass es beweist, dass der Server EOS ignoriert. – EJP

0

Der Server ignoriert die von Receive() zurückgegebene Anzahl. Es ist daher (a), endi des Stroms zu ignorieren und (b) ungültige Daten in dem Puffer zu verarbeiten.