当前位置: 代码迷 >> C# >> 异步TCP通讯,服务端在客户端累次连接请求时无效
  详细解决方案

异步TCP通讯,服务端在客户端累次连接请求时无效

热度:513   发布时间:2016-05-05 05:32:42.0
异步TCP通讯,服务端在客户端多次连接请求时无效。
本帖最后由 iloli 于 2013-11-25 20:18:22 编辑
问题 :
    在服务端的client = tcpListener.EndAcceptTcpClient(iar) 处设断点,第一次客户端点连接时 服务器端代码可以命中断点,并且返回一个TcpClient对象。第二次客户端再点连接时,服务器端有时候可以命中断点,返回TcpClient对象。第三次铁定就无法命中断定了,客户端无法得到服务器的响应。求解!!!

服务端相关代码:

 public void Start()
        {
            tcpListener = new TcpListener(ipAddr, port);
            tcpListener.Start();    //打开监听

            Thread listenerThead = new Thread(ListenConnect);
            listenerThead.IsBackground = true;
            listenerThead.Start(); //打开监听线程
            
 
        }

        public void ListenConnect()
        {
            TcpClient client = null;

            while (true)
            {//循环监听
                IAsyncResult iar = tcpListener.BeginAcceptTcpClient(null, null);
                while (!iar.IsCompleted)
                {//轮询是否有用户接入,这里不需要有时间超时,因为监听要做的是一直循环等待用户接入的工作
                    Thread.Sleep(sleepMilliseconds);
                }

                try
                {
                    client = tcpListener.EndAcceptTcpClient(iar);
                }
                catch (Exception)
                {

                    throw;
                }


                //client = tcpListener.AcceptTcpClient();

                if (client != null)
                {
                    //clientList.Add(client);
                    Thread clientThread = new Thread(ForwardPacket);
                    clientThread.IsBackground = true;
                    clientThread.Start(client); //为每个连接的用户打开数据通讯工作线程
                } 
            }
 
        }




客户端相关代码:

   private void btnTest_Click(object sender, EventArgs e)
        {
            NetworkStream ns;
            TcpClient client =new TcpClient(AddressFamily.InterNetwork);
            IAsyncResult iar = client.BeginConnect(IPAddress.Parse("172.30.218.132"), int.Parse("18000"), null, null);         
            while (!iar.IsCompleted)
            {
                Thread.Sleep(10);    
            }
            client.EndConnect(iar);                        
        }


------解决思路----------------------
引用:
以非同步方式接受連入的連接嘗試,並建立新的 TcpClient 來處理遠端主機通訊。

http://msdn.microsoft.com/zh-tw/library/system.net.sockets.tcplistener.endaccepttcpclient(VS.80).aspx
------解决思路----------------------
先说重点的吧。你的所谓 client 变量的定义,使得多个线程执行时可能共享/冲突。

再说次要的。实际上异步BeginXXX操作就不需要什么while语句、以及while里边还要嵌套一个死循环,这种东西!
  相关解决方案