求助,我新人,按照C#入门经典的程序修改了一个服务器端WINFORM程序,使用3个线程通讯,1个线程建立连接,连接后,启动另外2个线程,分别监听和发送。监听是阻塞式的,如果这个监听发生异常或者连续收到5次空内容,我会判断为断开,然后决定是否重新连接。现在的问题是,如果一直在通讯,不会有什么问题,如果长时间不用,如果1个小时不用,就会自动断开。搞不懂为什么。求教各路大神。还有就是不明白SOCKET连接字是什么意思?下面的连接线程里面的打码
 Listener = new TcpListener(IPAddress.Any, nPortNet);
            Listener.Start();
            try
            {
                Client = Listener.AcceptTcpClient();
                bLost = false;
                NetStream = Client.GetStream();
                bConectOK = true;
                while (true)
                {
                    if (bStopCon)//停止加工
                    {
                        break;
                    }
                    if (!Client.Connected)//没有连接
                    {
                        break;
                    }
                    if (bLost)//监听失败重新连接
                    {
                        //bLost = false;
                        
                        break;
                    }
                    if (!bListening)
                    {
                        bListening = true;
                        backgroundWorker2.RunWorkerAsync();
                    }
                    if (bNeedSend)
                    {
                        if (!bSending)
                        {
                            bSending = true;
                           
                            backgroundWorker3.RunWorkerAsync();
                        }
                    }
                    Thread.Sleep(100);                }
                NetStream.Close();            }
            catch {                MessageBox.Show("服务器关闭");
            }            Listener.Stop();//关闭侦听接收线程里面的代码int bufferSize=256;
            byte[] buffer=new byte[bufferSize];
            int readByte = 0;
            try
            {
                readByte = NetStream.Read(buffer, 0, bufferSize);
                string sTemp = Encoding.ASCII.GetString(buffer).Substring(0, readByte);                if (sTemp.Length > 0)
                {
                    W_Receive(sTemp);//处理接收到的数据
                }
                else
                {
                    nListenLostTimes++;
                    if (nListenLostTimes >= 5)
                    {
                        bLost = true;
                        nListenLostTimes = 0;//失去数据次数清零
                    }
                }
            }
            catch
            {
                MessageBox.Show("监听失败;请重新连接客户端");
                bLost = true;
                bMarking = false;            }

解决方案 »

  1.   

    设置超时时间
    ReciveTimeOut//接收超时
    SendTimeOut//发送超时
      

  2.   

    用TCP协议的话,调用socket.connect后就会和服务器连接,在调用socket.close方法之前是不会中断连接的。之间的时间可以调用socket.send和receive收发数据。 
    TCP协议本身是持久保持连接的,但是服务器程序为了节省资源,会有一个时间策略来定时察看某个连接最近一次收发数据的时间到现在的间隔,如果这个间隔大于事先定好的某个值,服务器会主动断开这个连接
    如果要让某个客户端软件一直保持和这种服务器的连接,就是要定时的在小于上述时间间隔内向服务器发送有效的数据包。
    我以前记得试验过,,貌似大概5分钟不操作(send,receive)这个连接就会关掉
      

  3.   

    TcpClient用WriteTimeout和ReadTimeout设置超时时间,将该事件设大即可解决断开问题,例如
    NetStream.WriteTimeout=5*1000//5秒发送超时
    NetStream.ReadTimeout=5*1000//5秒读取超时