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();
いいえ、これは不思議ではありません。 TCPはストリーミングプロトコルです。 1つの 'Send()'は 'Receive()'に対応していません。あなたは 'Receive()'によって返された値を無視せず、メッセージ全体を受け取ったことを知るまでバッファを追加し続ける必要があります。 – CodeCaster
@コードキャスター私は受け取った完全なデータです。それと同じデータを読み続けること。データを一度だけ読み取るために通常の状況ではブロックされます。 – nyconing
そうですね、あなたが何を意味するのか分かりません。このコードは壊れています。何をしているのかわからない場合はソケットを使用しないでください.HTTPのような上位プロトコルを使用してください。 – CodeCaster