C#TCP客户端不能在行中获得多条消息

我已经构建了一个可以连接到我的服务器的应用程序。 一切都运行顺利,但是当服务器同时向客户端发送消息时我遇到了问题。 例如当服务器在行中发送2条消息时。 客户只收到第一个。 是否有可能在行中获得多条消息?

这是我的客户代码部分:

TcpClient clientSocket; public string IPS= "###.###.###.###"; public int SocketS = ####; public void ConnectingToServer() { clientSocket= new TcpClient(); clientSocket.Connect(IPS, SocketS); if (clientSocket.Connected) { serverStream = clientSocket.GetStream(); byte[] outStream = System.Text.Encoding.ASCII.GetBytes(); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); } } // Function for send data to server. public void SendDataToServer(string StrSend) { if (clientSocket.Connected) { byte[] outStream = System.Text.Encoding.ASCII.GetBytes(StrSend); serverStream.Write(outStream, 0, outStream.Length); serverStream.Flush(); } } // Function for receive data from server (I put this in looping). public void getMessage() { if (clientSocket != null) { if (clientSocket.Connected) { if (serverStream.DataAvailable) { int buffSize = 0; buffSize = clientSocket.ReceiveBufferSize; byte[] inStream = new byte[buffSize]; serverStream.Read(inStream, 0, buffSize); string StrReceive= System.Text.Encoding.ASCII.GetString(inStream); } } } } 

套接字的发送/接收function不保证 在一次通话时发送/接收您提供的所有数据 。 这些函数返回实际发送/接收字节数。 在您的情况下,您不能忽略 serverStream.Read(...)方法调用的结果。

这就是为什么应该设计应用程序级协议来交换事物(你称之为“消息”)。

设计协议有很多种方法,但我们以下面的“消息”协议为例:

 ---------------------------------------------------- | Number of string bytes | String bytes in UTF-8 | ---------------------------------------------------- | 1 byte | 2 - ... bytes | ---------------------------------------------------- 

发送“消息”:字符串应转换为UTF-8(例如)表示 ,并使用字节表示的字节长度发送它(如上所述)。

接收消息:将数据接收到内存缓冲区。 提取“消息”的过程与发送消息相反。 当然,您可以同时收到多条“消息”,因此请彻底处理缓冲区。

我刚刚写了一篇包含代码示例的小文章 。