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阻塞没有问题,不管同步还是异步,在没有数据可读时,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就可以执行下去了