下面的代码读取了从tcp客户端流中读取的所有内容,并且在下一次迭代中,它将只放在Read()上(我假设正在等待数据)。如果没有什么东西可以阅读,我怎么能确保它没有呢?我是否必须设置低超时,并在失败时响应异常?还是有更好的方法?
TcpClient tcpclnt = new TcpClient();
tcpclnt.Connect(ip, port);
Stream stm = tcpclnt.GetStream();
stm.Write(cmdBuffer, 0, cmdBuffer.Length);
byte[] response = new Byte[2048];
MemoryStream ms = new MemoryStream();
byte[] buffer = new Byte[2048];
int length;
while ((length = stm.Read(buffer, 0, buffer.Length)) > 0)
ms.Write(buffer, 0, length);
byte[] response = ms.ToArray();
tcpclnt.Close();
答案 0 :(得分:1)
TcpClient 有两个我要玩的属性。
答案 1 :(得分:1)
也许你应该使用多线程。一个线程应该等待数据,另一个线程应该处理接收的数据。
答案 2 :(得分:0)
服务器是否有“Keep Connections Alive”?
我有服务器,只要你请求它们就会发送一个空字节流。
转动“Keep Connections Alive”停止了这样做。
答案 3 :(得分:0)
var socket = new System.Net.Sockets.TcpClient();
socket.NoDelay = true;
socket.Connect(uri.Host, port);
var ns = socket.GetStream();
int timeout = 500; //ms
DateTime lastReceived = DateTime.Now;
string buffer = "";
while (true)
{
if (ns.DataAvailable)
{
var b = ns.ReadByte();
buffer += b + ", "; //customise this line yourself
lastReceived = DateTime.Now;
continue;
}
if (lastReceived.AddMilliseconds(timeout) < DateTime.Now) break;
System.Threading.Thread.Sleep(timeout / 5);
}