我使用TcpClient( C#.NET 4 )实现了TCP客户端连接服务器:
// TCP client & Connection
TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Parse(IP), PORT));
NetworkStream clientStream = client.GetStream();
// Get message from remote server
byte[] incomingBuffer = new byte[1024];
Int32 bytes = clientStream.Read(incomingBuffer, 0, incomingBuffer.Length);
string problesWithThis = System.Text.Encoding.ASCII.GetString(incomingBuffer, 0, bytes);
与服务器的连接效果很好。但我可以只读取服务器的部分答案,并在下次连接尝试时读取未传递的部分消息。
我尝试设置NetworkStream超时:
// No change for me
clientStream.ReadTimeout = 10000;
然后我尝试模拟超时:
// This works well, the client has enough time to read the answers. But it's not the right solution.
// ....
NetworkStream clientStream = client.GetStream();
Thread.Sleep(TimeSpan.FromSeconds(1));
// Read stream ....
答案 0 :(得分:4)
数据通过TCP以数据包形式传输,这些数据包是串行传输的(但不一定是正确的顺序)。当数据可用时,即当接收到逻辑(如果不是chronolgically)下一个数据包时,clientStream.Read()
将立即返回此数据(可能是任何其他oo序列)中的数据 - 无论是否是发送方发送或未发送的所有数据。
您的Thread.Sleep()
使程序等待一秒钟 - 此时多个数据包到达并在系统级别进行缓冲,因此对clientStream.Read()
的调用将立即返回可用数据。
处理此问题的正确方法是循环Read()
,直到BytesAvailable()
变为零或检测到完整的应用层协议元素。