我在做一个课题时候,使用服务器端和客户端通信,正常时候,两边都好好的。客户端不断的连接服务器,连接上后就开始发设定好的字符串。服务器端多线程接收这些字符
现在出现有个问题是,服务器端启用一个线程接收一个客户端的连接后,如果这个客户端突然掉线后,线程就卡在stream.Read(bytes, 0, bytes.Length),这个线程也不退出。
 
下面是服务器端代码,
class MyServer
    {
        static TcpClient st_client;
        static Thread clientservice;
        public static void Main()
        {
            TcpListener server = null;
            
            try
            {
                Int32 port = 6001;
                IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress localAddr = ieh.AddressList[0]; 
                server = new TcpListener(localAddr, port);
                server.Start();               
                while (true)
                {
                    Console.Write("Waiting for a connection... ");
                    st_client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");
                    clientservice = new Thread(new ThreadStart(ServiceClient));
                    clientservice.Start(); 
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                
                server.Stop();
            }
        }
        private static void ServiceClient()
        {
            Console.WriteLine("In Thread!");
            TcpClient client = st_client;
            Byte[] bytes = new Byte[1024];
            String data = null;
            NetworkStream stream = client.GetStream();
            int i;
            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                Console.WriteLine("stream.Read {0}",i);                
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                Console.WriteLine("Received: {0}", data);               
                
            }
            client.Close();
            Console.WriteLine("Out Thread,Disconnected!");
        }
            
    }
 
 
 
 
 

解决方案 »

  1.   

    在TCP通信的过程中最好是有固定的心跳报文机制,通过这种机制来检测TCP连接是否畅通,其它方法在.NET均不能很好的检测连接的中断。
    尽管TCP本身有keep-live的机制,类似于心跳电文,但是在很多都地方都不推荐使用,而且用起来都不太方便,所以如果有可能还是自己定义心跳电文吧。
      

  2.   

    回phy 
    对你说的“心跳报文机制”,不明白。
    我就是想着在服务器端来一个tcp连接后,启动一个线程,然后和客户端通信,
    如果客户端掉线,这个线程能自己结束
      

  3.   

    好像有个Connected 属性吧,如果是false就关闭连接.
      

  4.   

    是有个connected属性,但是线程主要时间都是在stream.Read这里,客户端掉线时间也一般都是发生在这里while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
                { 
                    Console.WriteLine("stream.Read {0}",i);                
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
                    Console.WriteLine("Received: {0}", data);              
                    if(client.connected = false) break;
                } 
      

  5.   

    楼主可以这样尝试下:
                bool keepalive = true; //循环条件
                          while (keepalive)
                {
                    try
                    {
                        读取数据          
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("接受消息失败!" + ex.Message);
                    }
                    keepalive = false;
                    socket.Close();
                    clientThread.Abort(); //强制结束这个新线程
                }        }