我已经构建了一个可以连接到我的服务器的应用程序。一切都运行顺利,但是当服务器同时向客户端发送消息时我遇到了问题。例如当服务器在行中发送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);
}
}
}
}
答案 0 :(得分:1)
套接字的发送/接收功能不保证 将在一次通话中发送/接收您提供的所有数据 。这些函数返回实际发送/接收字节数。在您的情况下,不得忽视 serverStream.Read(...)
方法调用的结果。
这就是为什么应该设计应用程序级协议来交换事物(你称之为“消息”)。
设计协议有很多种方法,但我们以下面的“消息”协议为例:
----------------------------------------------------
| Number of string bytes | String bytes in UTF-8 |
----------------------------------------------------
| 1 byte | 2 - ... bytes |
----------------------------------------------------
发送“消息”:字符串应转换为 UTF-8(例如)表示,并使用字节表示的字节长度发送它(如如上所述。)
接收消息:将数据接收到内存缓冲区。提取“消息”的过程与发送消息相反。当然,您可以同时收到多条“消息”,因此请彻底处理缓冲区。