即使服务器,有时recByte
也无法收到响应
确实回复,因为服务器不够快。如果发生了,我使用
catch (System.IO.IOException ioe)
以防止错误,但有没有可能的替代方案允许客户端等待一段时间? 我确实试过了
clientStream.ReadTimeout = 20000;
但它无效
TcpClient Client = new TcpClient();
Client.Connect(ipaddress, portnum);
NetworkStream clientStream = Client.GetStream();
byte[] buffer = themessagetosent;
clientStream.Write(buffer, 0, buffer.Length);
byte[] recByte = theresponse;
clientStream.Read(recByte, 0, recByte.Length);
答案 0 :(得分:1)
您需要增加tcpClient的超时,而不是流的超时。此外,可能希望增加send
和receive
的超时,并且可能超过2秒。
var client = new TcpClient { SendTimeout = 10000, ReceiveTimeout = 10000 };
我相信如果你在IOException中查看内部异常,你会看到里面的SocketException。查看错误代码以了解究竟发生了什么。
答案 1 :(得分:1)
如果服务器发送的字节数非常少,您可以考虑在服务器端使用socket.NoDelay = false(如果需要,也可以在客户端使用),这会禁用Nagle算法并强制tcp / ip堆栈立即发送数据没有寻找进一步收集的数据。
当你有专门的线程来处理套接字和数据读取时,CanRead和DataAvailable会很好用。
答案 2 :(得分:0)
在此example on MSDN中查看CanRead
和DataAvailable
的使用情况。