首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

networkstream对象read()时挂了咋回事

2012-10-13 
networkstream对象read()时挂了怎么回事?服务器端:int listenPort 1987IPAddress ipAddress IPAddres

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就可以执行下去了

热点排行