2016-04-06 18 views
0

Java(クライアント)およびC#(サーバー)TCPソケット。サーバーはクライアント(Java)から無限の最後のデータを読み込みます 私はすでに、その奇妙な一日のために検索されています。Java(クライアント)およびC#(サーバー)TCPソケット。サーバーはクライアントから無限最後のデータを読み取る

私は2クライアントを作成します。Java(実)、C#(テスト用)、このような :

のJava(レアル):(テスト用)

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(); 

と C#の

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(); 

C#(テスト)側では、1つのデータをサーバーに送信し、サーバーはデータを一度読み取ってブロックして別のデータを待機させました(2回目のデータは一度読み取ってブロックしたのと同じです)こういうの

Java(Real)側では、サーバーとサーバーに2つのデータを送信して1回目のデータを1回読み取り、2回目の同じデータを永久に読み取りました。 Java側の検証は一度だけ行われます。

私は受け取った完全なデータです。どうして?それは奇妙だ。

結果:C#の(試験)

クライアント要求接続に

サーバーが受け入れ、作成した接続。

サーバー読むを試す(およびブロック)

クライアントの送信>>

サーバーが受信のTextBox >> TextBoxの

サーバー(

が、Javaでの読み取りを試みる(およびブロック)リアル):

クライアントリクエストconnectイオン。

サーバーが受け入れ、作成した接続。

Serverは、読み取りを試みる(およびブロック)

クライアントの送信>> こんにちは!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Serverは>> こんにちは受け!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!

クライアントの送信>>はいこの他のデータ

Serverは、サーバーが受信

を読む試す>>はいこの他のデータ

Serverは、サーバーはい>>この他のデータを受信

を読む試します

サーバー試してみる

Serverははいこの他のデータ

Serverが別のデータ

このはい>>サーバが受信

を読む試す>>はいこの他のデータ

Serverは、サーバーが受信

を読む試す>>受け

サーバー試してみてください

サーバーが受信しました>>はいこの別のデータ

(そして永遠に、永遠に)

Serverコード:

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

いいえ、これは不思議ではありません。 TCPはストリーミングプロトコルです。 1つの 'Send()'は 'Receive()'に対応していません。あなたは 'Receive()'によって返された値を無視せず、メッセージ全体を受け取ったことを知るまでバッファを追加し続ける必要があります。 – CodeCaster

+0

@コードキャスター私は受け取った完全なデータです。それと同じデータを読み続けること。データを一度だけ読み取るために通常の状況ではブロックされます。 – nyconing

+0

そうですね、あなたが何を意味するのか分かりません。このコードは壊れています。何をしているのかわからない場合はソケットを使用しないでください.HTTPのような上位プロトコルを使用してください。 – CodeCaster

答えて

-2

イムは日が調査した後、問題が何であるかを発見しました。

が、そのまだ奇妙な:Javaクライアント上

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

それはそれを正しく閉じていませんでした。おそらくプロトコルがまだどこにあるかclose_wait状態はすべてのパケットがサーバーに到着していることを確認しますか?

偽決意

イムは、私自身のコマンドパケットは「cmd_request_close_connection」のようにサーバに送信、書き込み、およびサーバは、このようにパケットを受信したときに、サーバー側の接続を閉じます。

+0

問題がどのように続くかを説明する他の最善の答えがなければ、私自身の答えは明日私の自己を受け入れる。 – nyconing

+0

これは問題ではありません。問題は、受信側がストリームの終わりを無視していることです。 CLOSE_WAITは、サーバーがEOSを無視していることを証明することを除いて、それとは何の関係もありません。 – EJP

0

サーバは、Receive()によって返されたカウントを無視しています。従って、(a)ストリームのエンドを無視し、(b)バッファ内の無効なデータを処理する。

関連する問題