我已经创建了一个TCP服务器.我面临一个问题.我的TCP服务器没有收到大于30000字节的数据.
这是接收数据的代码
MAX_TCP_DATA = 64000
private void Process()
{
if (client.Connected == true)
{
log.InfoFormat("Client connected :: {0}", client.Client.RemoteEndPoint);
Byte[] bytes = new Byte[MAX_TCP_DATA];
String data = null;
NetworkStream stream = client.GetStream();
int i;
try
{
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// bytes contains received data in byte[].
// Translate data bytes to a UTF-8 string.
byte[] receivedBuffer = new byte[i];
Array.Copy(bytes, receivedBuffer, i);
if (log.IsDebugEnabled)
{
data = System.Text.Encoding.UTF8.GetString(receivedBuffer);
log.InfoFormat("Received MSG ::: " + data);
}
CommEventArgs comEventArg = new CommEventArgs();
comEventArg.data = receivedBuffer;
IPEndPoint remoteIPEndPoint = (IPEndPoint)client.Client.RemoteEndPoint;
comEventArg.srcAddress = remoteIPEndPoint.Address.ToString();
comEventArg.srcPort = remoteIPEndPoint.Port;
comEventArg.length = i;
this.OnDataReceived(comEventArg);
}
}
catch (Exception ex)
{
log.InfoFormat("Client disconnected : {0}", client.Client.RemoteEndPoint);
}
finally
{
client.Close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我发送40000字节数组时,我的TCP服务器只收到26280字节.
请告诉我收到的问题在哪里.
小智 5
问题是您无法接收任意大小的数据包.我的代码中没有看到任何表明流协商的内容.TCP是一种流协议,较低级别使用数据包,因为它必须.这意味着您的发送数据被分成任意数据包.恢复结束数据包的大小几乎是随机的(在缓冲区中非常多),甚至可能无法转换为完全强大的正确UTF8.
这个:
while((i = stream.Read(bytes,0,bytes.Length))!= 0)
不是读取客户端发送的所有数据,而是读取服务器收到的所有数据.这可能不完整.
你需要进入文档并实际完成你的作业 - 即阅读它.
它说:
Read操作将读取尽可能多的数据,最多可达size参数指定的字节数.
基本上,目前没有更多的数据.它可能在一毫秒后出现.这就是为什么你需要知道在处理之前要读取多少数据的原因 - 使用你自己的数据包结构(例如在前两个字节中有一个长度标志),或者使用CLRLF来指示行尾 - 所以当你得到一个你知道你可以处理所有字节之前.
这里简单的方法根本不起作用,因为数据传输不是即时的.Read方法将读取接收器上缓存的任何内容,并且您认为这基本上都是.
同时,除了处理插座外,其余时间不是必需的.同样,文档有助于:
如果没有可用于读取的数据,则NetworkStream.Read方法将阻塞,直到数据可用.
所以,除了底层套接字被关闭之外,它不会返回0(然后它应该抛出一个excception).因为它会等到(某些)数据到达.
提示:阅读文档不是一件容易的事.在你的情况下,根据文档,你假设一个显然完全不存在的行为.
| 归档时间: |
|
| 查看次数: |
5501 次 |
| 最近记录: |