日期:2014-05-17  浏览次数:21028 次

networkstream对象read()时挂了怎么回事?
 
服务器端:
  int listenPort = 1987;
  IPAddress ipAddress = IPAddress.Parse("127.0.0.1");

  TcpListener listener = new TcpListener(ipAddress, listenPort);
  listener.Start();
  while(true)
  {
  try
  {
  Socket socket = listener.AcceptSocket();
  clientSocket = socket;
  clientService = new Thread(new ThreadStart(ServiceClient));
  clientService.Start();
  }catch(Exception ex){
  Console.WriteLine(ex.ToString());
  }
  }
客户端:  
TcpClient clientsocket = new TcpClient("127.0.0.1", 1987);
NetworkStream ns = new NetworkStream(clientsocket.Client);
Byte[] bytes = new Byte[1024];
ns.Read(bytes, 0, bytes.Length);

客户端执行到ns.Read(bytes, 0, bytes.Length);时,客户端死掉了。

------解决方案--------------------
不是客户端死掉了,而是read方法在没有数据可读时会阻塞,正如console.readline在没有输入会阻塞一样
------解决方案--------------------
探讨

引用:

不是客户端死掉了,而是read方法在没有数据可读时会阻塞,正如console.readline在没有输入会阻塞一样

那该怎么处理呢?
我刚接触这个,还是不是很懂

------解决方案--------------------
Read阻塞没有问题,不管同步还是异步,在没有数据可读时,Read所在的线程都会阻塞。
问题在于服务器一直没给客户端发送数据,应该把
Socket socket = listener.AcceptSocket();
。。。
clientService.Start();

的代码改成:

while (true) {
TcpClient client = listener.AcceptTcpClient();

byte[] data = Encoding.Unicode.GetBytes("要发送的数据");

client.GetStream().Write(data, 0, data.Length);

client.GetStream().Close();
client.Close();
}

这样客户端Read就可以执行下去了