如何解决TCP侦听器将消息剪切为1024个字节
| 问题刚开始在客户端。这是我收到TCP / IP消息的代码。在我的本地PC上,此侦听器接收到许多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,myReadBuffer.Length);
myCompleteMessage.AppendFormat(\"{0}\",Encoding.ASCII.GetString(myReadBuffer,numberOfBytesRead));
} while (netStream.DataAvailable);
//All we do is response with \"OK\" message
var sendBytes = Encoding.ASCII.GetBytes(\"OK\");
netStream.Write(sendBytes,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个字节来保存其长度;然后,您可以一直读下去直到收到那么多字节为止)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。