Java(客户端)和C#(服务器)TCP套接字。和服务器从客户端读取无限的最后数据(Java) 我已经搜索了整整一天,这很奇怪。
我创建了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#(测试)方面,将一个数据发送到服务器,服务器将数据重新加入一次并阻止等待另一个数据。(第二个数据与读取一次并阻止相同)我只是想这样。
在Java(Real)端,向服务器和服务器发送两个数据,读取第一个数据一次,永远读取相同的第二个数据。 Java端验证只发送一次。
这是我收到的完整数据。为什么?它奇怪。
结果为:
关于C#(测试)
客户请求连接。
服务器接受并创建连接。
服务器尝试读取(和阻止)
客户端发送>>文本框
收到的服务器>>文本框
服务器尝试读取(和阻止)
但是在Java(Real)上:
客户请求连接。
服务器接受并创建连接。
服务器尝试读取(和阻止)
客户端发送>> 你好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!
收到的服务器>> 你好!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!
客户端发送>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
服务器尝试阅读
收到的服务器>>是的,这是另一个数据
(永远永远)
服务器代码:
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 :(得分:0)
服务器忽略Receive()
返回的计数。因此,(a)忽略流的endi和(b)处理缓冲区中的无效数据。
答案 1 :(得分:-2)
我发现经过一天的调查后发现了什么问题。
但它仍然很奇怪:
Java客户端上的:
socket.close();//<--here causing a start of server read same last data infinitly
没有正确关闭它。也许协议仍然是 close_wait 状态,以确保所有数据包都到达服务器?
假决心:
我写自己的命令包发送到服务器,如“cmd_request_close_connection”,并在服务器接收这样的数据包时关闭服务器端的连接。