我做了一个服务器端的程序,要实时在线监听客户端的连接。while (true)
            {
                try
                {
                    hospitalTcpClient = hospitalTcpListener.AcceptTcpClient();
                }
                catch
                {
                        hospitalTcpListener.Stop();
                }但是这样在停止监听时就会出错,因为hospitalTcpListener.AcceptTcpClient();正在阻塞中,
问题1:设计模式不对?那如何设计?
问题2:采用这种模式,那如何正确的结束监听呢?
谢谢~~

解决方案 »

  1.   

    AcceptTcpClient()之后,就把接收的任务放到线程中去作;你的这个监听最也好放到一个线程中,这样主线程就不会被阻塞了;
      

  2.   

    谢谢楼上
    我的程序启动之后就开启了一个线程1(防卡),在1中进行AcceptTcpClient(),然后如果有客户连接,会再启动一个线程2(每个客户都有一个线程),现在的问题是,如何才能结束监听呢?
      

  3.   

    1,线程需要关闭 TempThread.Abort()
    2,监听需要关闭 lisner.Stop(); 
    3,关闭套接字   Socketclient.Close(); 
    4, 如果是传文件的话还需要关闭流文件 MyFileStream.close();
      

  4.   

    看3楼问题。
    如果用TempThread.Abort()结束线程,那我以后就无法开启这个线程了。
      

  5.   

    Thread.Abort(),是结束线程后不可恢复。
    如果我没有关闭程序,只是暂时停止监听了,如果把线程都终结了,我怎么再把线程启动起来,难道把软件重启?
      

  6.   

    他所指Thread.Abort()是指接收连接的线程,即listener.accepttcpclient,你说的那个是主线程关了事就大了
      

  7.   

    hospitalTcpListener.AcceptTcpClient(); 这一句会堵塞,直到有连接过来。而一直while(true),这样程序就停止响应了。可以考虑使用异步侦听:BeginAcceptTcpClient
      

  8.   

    创建TcpListener并监听
    开启线程1进行接收客户端的连接得到TcpClient,同时开启线程2进行该TcpClient的接收TcpClient.close()后关闭线程2
    接着关闭线程1 TcpListener.stop()(如果监听对象不关闭,下次重新开启线程1就可继续接收)也可把这两个线程的isbackground属性设置为true 这样主线程关闭时他们也会关闭
      

  9.   


    有几个地方我不太明白,还请指教:
    1.创建TcpListener并监听----只是接受一个客户端吗?如果不是,那
    这个应该不能关闭吧?这是一个从线程,就是说有客户连接的时候都走这步,是不是应该让其执行完之后自动退出呢?
      

  10.   

    1.TcpListener是监听对象,实际上TcpListener.acceptTcpCLient(即TcpClient)才是一个连接对象,即一个TcpClient对应一个客户端,你的TcpListener.acceptTcpCLient不是写在循环内么,就是为了能够建立多个连接对象
    2.我的意思就是你要在线程关闭前释放这个对象的资源
      

  11.   

    我大概是明白哪不对了 TcpListener.Start()是开启监听,这个地方不存在阻塞一说,
    打个比方,就好比你要去个地方求职(相当与你这里客户端的连接) TcpListener就相当于老板 TcpListener.acceptTcpCLient相当与老板在等人来应聘 你客户端有连接请求就相当与来应聘 没人来他就一直在等不能做下面的事 这就是阻塞 假如你销毁了线程 他也就不等了 但是TcpListener也就是老板依旧存在 你的阻塞的监听这个概念应该是相当与老板等与不等的概念 
      

  12.   

    对,TcpListener.Start()不存在阻塞,阻塞的是TcpListener.acceptTcpCLient()这句,所以在stop时会出错,并且我又不能结束这个阻塞的线程,因为如果我结束了就没法再启动他了。
      

  13.   

    。。
    Thread thread=new Thread(new ThreadStart(接收连接方法));
    void Start()
    {
    listener创建thread.start()
    }
    再想开启thread.start()不行么?
      

  14.   

    private void btnStartService_Click(object sender, EventArgs e)
            {
                Thread startExpertServiceThread = new Thread(new ThreadStart(BeginListenExpert));
                startExpertServiceThread.IsBackground = true;
                startExpertServiceThread.Start();
            }
            public void BeginListenExpert()
            {
                try
                {
                    expertTcpListener = new TcpListener(IPAddress.Parse(this.getIpValuesDelegate()), 7000);
                    expertTcpListener.Start();
                   
                }
                catch (Exception ex)
                {
                    //BLL.Assist.WriteLogs("端口" + expertTcpListener.LocalEndpoint.ToString().Split(':')[1] + "监听失败原因:" + ex.Message);
                    MessageBox.Show("端口"+expertTcpListener.LocalEndpoint.ToString().Split(':')[1]+"监听失败!网络连接不可用或另一个程序正在运行!");
                    return;
                }
                //BLL.Assist.WriteLogs("专家服务程序开始监听客户端的请求!");
                while (true)
                {
                    try
                    {
                        expertTcpClient = expertTcpListener.AcceptTcpClient();//有客户连接的时候发生
                    }
                    catch
                    {
                        try
                        {
                            hospitalTcpListener.Stop();
                            //this.exceptionWorkDelegate();
                        }
                        catch
                        {
                            //this.exceptionWorkDelegate();
                        }                    continue;
                    }
                    string expertRemoteEndPoint = expertTcpClient.Client.RemoteEndPoint.ToString();
                    //BLL.Assist.WriteLogs("与" + expertRemoteEndPoint.Split(':')[0] + "在端口" + expertRemoteEndPoint.Split(':')[1] + "建立连接");
                    expertClientList = new BLL.ClientList(expertTcpClient);                ParameterizedThreadStart pts = new ParameterizedThreadStart(ExpertStartService);
                    Thread myThread = new Thread(pts);
                    myThread.Start(expertClientList);
                }
            }
            public void ExpertStartService(object obj)
            {
                try
                {
                    BLL.ClientList expertClientList = (BLL.ClientList)obj;
                   // string clientIP = expertClientList.Clients.Client.RemoteEndPoint.ToString().Split(':')[0];
                    bool IsConnect = expertClientList.Clients.Connected;
    ……………………
      

  15.   

    上面就是源代码中的相关部分,现在的问题是如何正确的调用stop(),将expertTcpListener.AcceptTcpClient();结束,因为他正在等待中,阻塞了,结束时会异常,并且无法关闭,只有在退出程序时才会释放监听端口。
    private void btnStartService_Click(object sender, EventArgs e)
    是开启服务的按钮事件,问的就是停止监听按钮如何设计?