1

我已经构建了一个可以连接到我的服务器的应用程序。一切运行顺利,但是当服务器同时向客户端发送消息时出现问题。例如当服务器连续发送 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);
            }
        }
    }
}
4

1 回答 1

1

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

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

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

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

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

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

例子

我刚刚写了一篇带有代码示例的小文章

于 2013-02-06T09:31:34.630 回答