Java(客户端)和C#(服务器)TCP Socket。和服务器从客户端读取无限的最后数据

时间:2016-04-06 09:32:57

标签: java c# sockets tcp

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

2 个答案:

答案 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”,并在服务器接收这样的数据包时关闭服务器端的连接。