3

下面的代码从 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

4 回答 4

1

TcpClient有两个我会使用的属性。

  1. NoDelay获取或设置一个值,当发送或接收缓冲区未满时禁用延迟。
  2. ReceiveTimeout获取或设置一旦启动读取操作,TcpClient 将等待接收数据的时间量
于 2009-05-07T17:26:32.637 回答
1

也许你应该使用多线程。一个线程应该等待数据,另一个应该处理接收到的数据。

于 2009-05-08T18:33:35.953 回答
0

服务器是否启用了“保持连接活动”?

我有服务器,只要您请求它们,它们就会向您发送空字节流。

转动“保持连接活动”会阻止它这样做。

于 2009-05-07T16:11:57.730 回答
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);
            }
于 2012-06-01T19:27:22.163 回答