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不需要一次性将您排队的所有数据发送到它。这意味着它可以一次发送尽可能少的数据,并且可以随意选择将您的数据分割成多个部分。特别是,保证在数据不适合一个数据包的情况下拆分数据。通常,最大数据包大小(也称为MTU)是1532字节IIRC。
因此,数据确实有可能被发送,但作为一个以上的数据包。接收第一个和第二个数据包之间的延迟可能意味着,当第一个数据包到达时,您的代码会愉快地读取其中包含的所有内容,然后在第二个包到达之前停止(不再有数据)。
你可以通过观察网络流量,或者允许你的应用程序从网络中提取更多信息,看看它是否最终获得了你发送的所有数据(尽管是零散的)来检验这一假设。
最终,根本问题是TCP基于流(而不是基于消息)的基本特性;即使您使此代码正常工作,也不能保证它在未来继续工作,因为它对TCP无法保证的内容进行了假设。
为了安全起见,您需要包含一个基于消息的结构(例如,在每条数据之前,正好有4个字节可以保持其长度;然后,您可以一直阅读,直到收到那么多字节)。