TCP侦听器将消息剪切为1024字节

本文关键字:1024字节 消息 侦听器 TCP | 更新日期: 2023-09-27 17:59:23

客户端刚刚出现问题。这是我接收TCP/IP消息的代码。在我的本地电脑上,这个听众收到了很多K,没有问题。我试图增加缓冲区大小,但在客户端网站上,他们仍然报告与此相关的问题。仍然得到了第一个1K(1024字节)

public void Start()
{
  //Define TCP listener
  tcpListener = new TcpListener(IPAddress.Any, IDLocal.LocalSession.PortNumber);
  try
  {
    //Starting TCP listenere
    tcpListener.Start();
    while (true)
    {
      var clientSocket = tcpListener.AcceptSocket();
      if (clientSocket.Connected)
      {
        var netStream = new NetworkStream(clientSocket);
        // Check to see if this NetworkStream is readable.
        if (netStream.CanRead)
        {
          var myReadBuffer = new byte[1024];
          var myCompleteMessage = new StringBuilder();
          // Incoming message may be larger than the buffer size.
          do
          {
            var numberOfBytesRead = netStream.Read(myReadBuffer, 0, myReadBuffer.Length);
            myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
          } while (netStream.DataAvailable);
          //All we do is response with "OK" message
          var sendBytes = Encoding.ASCII.GetBytes("OK");
          netStream.Write(sendBytes, 0, sendBytes.Length);
          clientSocket.Close();
          netStream.Dispose();
          // Raise event with message we received
          DataReceived(myCompleteMessage.ToString());
        }
      }
    } 
  }
  catch (Exception e)
  {
    //If we catch network related exception - send event up
    IDListenerException(e.Message);  
  }
}

TCP侦听器将消息剪切为1024字节

我看不出您发布的将消息提取为字符串的代码有任何问题,所以我猜还有其他事情在进行中。

TCP不需要一次性将您排队的所有数据发送到它。这意味着它可以一次发送尽可能少的数据,并且可以随意选择将您的数据分割成多个部分。特别是,保证在数据不适合一个数据包的情况下拆分数据。通常,最大数据包大小(也称为MTU)是1532字节IIRC。

因此,数据确实有可能被发送,但作为一个以上的数据包。接收第一个和第二个数据包之间的延迟可能意味着,当第一个数据包到达时,您的代码会愉快地读取其中包含的所有内容,然后在第二个包到达之前停止(不再有数据)。

你可以通过观察网络流量,或者允许你的应用程序从网络中提取更多信息,看看它是否最终获得了你发送的所有数据(尽管是零散的)来检验这一假设。

最终,根本问题是TCP基于流(而不是基于消息)的基本特性;即使您使此代码正常工作,也不能保证它在未来继续工作,因为它对TCP无法保证的内容进行了假设。

为了安全起见,您需要包含一个基于消息的结构(例如,在每条数据之前,正好有4个字节可以保持其长度;然后,您可以一直阅读,直到收到那么多字节)。