本人是个新手。第一次用TcpListener做服务器。发现一个问题。当服务器监听端口时,客户端断开时在网络连接处还可以看到原本客户端连接的信息。当新的客户端连接时又出现一个新的连接,在此我想知道如何去掉之前的客户端连接。。因为我是新手。各位大大能不能帮我看看我的程序那儿出了问题。最好能有程序上来
以下是我编的程序(本人不会异步。所以用了同步的)
//定义
delegate void AddString_del(string str);
        AddString_del addDel;//该代理用于向接收窗体添加数据
Thread thListen;//监听线程
        TcpClient tcpClient;
        TcpListener serverListener;
        bool islian = false;
#region 点击GPRS打开事件
        /// <summary>
        /// 点击GPRS打开事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpenGPRS_Click(object sender, EventArgs e)//
        {
            IPAddress serverIp=null;
            int port = 0;
            serverIp = IPAddress.Parse(this.IP.Text.ToString());
            port = Convert.ToInt32(this.port.Text.ToString());
            IPEndPoint local = new IPEndPoint(serverIp, port);
            serverListener = new TcpListener(local);
            serverListener.Start();
                       //
            thListen = new Thread(new ThreadStart(ServerListen));
            thListen.Start();
        }
        #endregion        #region 监听GPRS客户端
        /// <summary>
        /// 监听GPRS客户端
        /// </summary>
        private void ServerListen()
        {            while (true)
            {
                tcpClient = serverListener.AcceptTcpClient();
                Thread tcpthread = new Thread(DoSomeThing);//创建新线程,这样程序可以立刻进入下一次while循环,处理新的客户端接入
                tcpthread.Start(tcpClient);//把新获得的连接作为参数传过去(其实也可以不传,因为你的tcpClient是全局的)
            }
        }
        #endregion        #region 为每一个客户端接入创建的处理线程
        ///
        ///为每一个客户端接入创建的处理线程
        ///
        private void DoSomeThing(object parmater)
        {
            TcpClient newTcpClient = parmater as TcpClient;//将参数转换成TcpClinet 
            int a = 0;
            byte[] buffer = new byte[1024];            NetworkStream stream = newTcpClient.GetStream(); //            if (newTcpClient.Connected)
            {
                islian = true;
            }
            else
            {
                islian = false;
            }
            while (islian)
            {
                //Thread.Sleep(1000);
                try
                {                    a = stream.Read(buffer, 0, 1024);
                    string temp = "", message = "";
                    if (a > 0)
                    {
                        islian = true;
                        temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a);
                       // message += temp;                        message = Encoding.ASCII.GetString(buffer, 0, a);
                        textBox111.Invoke(addDel, temp + "\n");
                        //MessageBox.Show("接收到" + message);  
                        stream.Flush();
                    }
                    else
                    {
                        islian = false;
                        newTcpClient.Close();
                        break;
                        //stream.Flush();
                        //MessageBox.Show("断开");                    }
                    //stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉 
                }
                catch (Exception)
                {
                    //TODO:接收数据线程异常处理 
                    if (newTcpClient != null)
                    {
                        newTcpClient.Close();
                    }
                    islian = false;
                    //MessageBox.Show(ex.Message+"cuowu");
                    //textBox3.Invoke(addDel, ex.Message);
                    break;                }
            }        }
        #endregion
以上就是我所编的程序。。真的不知道如何在客户端断开后关闭连接。。希望有人能帮看看问题出在那儿

解决方案 »

  1.   

    http://www.cnblogs.com/wzd24/archive/2007/05/22/755050.html
    参考看看
      

  2.   

    int recv=socket.receive();客户端断开时,会出现recv=0;可以判断原来的客户端已经close了。可以参考《C#网络应用编程》
      

  3.   

    我这刚写的代码,还是热乎的。
                    //等待一个连接
                    while (true)
                    {
                        //接收一个客户端连接(AcceptSocket函数是阻塞的)
                        TCommon.WriteLog("等待一个客户端连接......", CLOG.TO_CONSOLE, CLABEL.INFO);
                        Socket client = m_Listener.AcceptSocket();
                        //取得客户端IP
                        m_strClientIP = client.RemoteEndPoint.ToString();
                        m_strClientIP = m_strClientIP.Substring(0, m_strClientIP.IndexOf(":"));
                        TCommon.WriteLog("客户端 : [" + m_strClientIP + "] 已连接。", CLOG.TO_BOTH, CLABEL.INFO);                    //接收数据
                        while (true)
                        {
                            Byte[] buffer = new Byte[CSOCKET.BUFF_SIZE];
                            //读取数据(Receive函数是阻塞的)
                            int ReceivedLength = client.Receive(buffer);
                            if (ReceivedLength > 0)
                            {
                                string strReceive = Encoding.Unicode.GetString(buffer, 0, ReceivedLength);
                                TCommon.WriteLog("从 [" + m_strClientIP + "] 收到 : " + strReceive, CLOG.TO_BOTH, CLABEL.INFO);
                                //处理收到的数据
                                ProcessData(strReceive);
                            }
                            else
                            {
                                //连接已断开
                                client.Shutdown(SocketShutdown.Both);
                                client.Close();
                                TCommon.WriteLog("客户端 : [" + m_strClientIP + "] 已断开。", CLOG.TO_BOTH, CLABEL.INFO);
                                break;
                            }
                        }                    //继续等待一个新的连接
                    }
      

  4.   

    Lonelywolf1899 能把你监听的程序发出来吗?还有上面的那段程序应该怎么放?是不是要给他放在一个函数里。如我给出的程序中的
    private void ServerListen()
    private void DoSomeThing(object parmater)这2个函数一样。测试了一下你的程序。发现
    不知道是我不会做还是有别的原因。。还是发现你那儿有很多的连接。。客户端断后连接还是存在。
      

  5.   

    那只有发心跳包了
    客户端定时发心跳包,服务器端收不到,就把对应的Socket关掉。
      

  6.   

    重点就是我不知道上面我发的程序中哪个是当前的socket了。不知道关哪个。。
      

  7.   

    还发现一个问题。当客户端发出的数据量大时 服务器就分段分段的接收到数据。。能不能在服务器接收数据时让他等待几秒钟。然后再read()数据呢?
      

  8.   

    我共享一个异步的socket 完整服务端和客户端 代码  自己去下载