我在写一个C#客户端应用程序,它将连接到用python编写的服务器。我的问题是关于循环接收数据。应用程序结构全部关于客户端请求服务器 - >服务器响应客户端。当消息低于实际缓冲区大小(在服务器中设置)时,一切正常。例如:服务器端缓冲区:1024,客户端缓冲区大小:256,数据长度< 1kb。运行我用下面的代码应用:在循环中接收网络数据的正确方法
int datacounter = 0;
byte[] recived = new byte[256];
StringBuilder stb = new StringBuilder();
serverStream.ReadTimeout = 1500;
try
{
while ((datacounter = serverStream.Read(recived, 0, 256)) > 0)
{
Console.WriteLine("RECIVED: " + datacounter.ToString());
stb.append(System.Text.Encoding.UTF8.GetString(recived, 0, datacounter));
}
}
catch { Console.WriteLine("Timeout!"); }
然后应用程序接收数据,在4个循环(每个256个字节):
RECIVED: 256
RECIVED: 256
RECIVED: 256
RECIVED: 96
然后超时蜱,即结束该传输并通过完整数据以后分析(来自stb对象)。我不认为使用超时是正确的,但我不知道有任何其他方式来做到这一点。 但是,这种方式起作用。下面我们以示例为例,它不包含: 服务器端缓冲区:1024,客户端缓冲区:256,数据长度〜8kbytes(python端在循环中发送数据)。
RECIVED: 256
RECIVED: 256
RECIVED: 256
RECIVED: 256
然后超时滴答(显然数据不完整 - 得到8kb的1kb)。有时循环甚至在1次运行后结束,28个recived字节,并且在超时之前。 Python表示数据已经正确发送。下面是我创建套接字和serverStream对象的方式:
TcpClient clientSocket = new TcpClient();
clientSocket.Connect("x.y.z.x", 1234);
NetworkStream serverStream = clientSocket.GetStream();
它不是TcpClient故障。尝试与清除套接字一样,创建像:
但是,它的工作原理类似。有没有办法,让我的循环无超时工作,接收所有数据?如果可能,我想保持套接字同步。
这是套接字读取超时异常。 –
好的抱歉,我没有赶上serverStream.Timeout属性。你完全确定这不是客户问题吗? 你可以使用Wireshark来嗅探,看看是否确实有超过1.5秒的超时。 – CharlieBrown
Wireshark听起来像一个好主意,我稍后会尝试。我很确定这是一个客户端问题,使用python编写的类似客户端根本没有任何问题。今天还重新安装了.NET,以检查它是否没有损坏 - 事实并非如此。关于你的编辑 - 如果最后一个数据包偶然会长256? :] –