确保streamreader不会挂起等待数据

时间:2009-05-07 16:01:11

标签: c# .net stream tcpclient

下面的代码读取了从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();

4 个答案:

答案 0 :(得分:1)

TcpClient 有两个我要玩的属性。

  1. NoDelay 获取或设置一个值,该值在发送或接收缓冲区未满时禁用延迟。
  2. ReceiveTimeout 获取或设置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);
            }