我正在编写一个 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
然后超时滴答作响(显然数据不完整 - 得到 1kb 的 8kb)。有时循环甚至在 1 次运行后以 28 个接收字节结束,而这一切都在超时之前结束。Python 表示数据已正确发送。这是我创建套接字和 serverStream 对象的方式:
TcpClient clientSocket = new TcpClient();
clientSocket.Connect("x.y.z.x", 1234);
NetworkStream serverStream = clientSocket.GetStream();
它不是 TcpClient 故障。尝试了相同的清除套接字,创建如下:
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
然而,它的工作原理相似。有没有办法让我的循环在没有超时的情况下工作,接收所有数据?如果可能的话,我想保持套接字同步。