最近稍微接触了点socket 所以就试着做了一个简易的聊天程序   可是只要启动程序  cpu就达到100% 
之前看过一篇帖子  说是死循环造成线程太多  建议用异步  不过我不会 还有说把while(true)去掉 可是去掉的话 就无法监听了呀    如果就用目前的代码修改的话 应该怎么做 请教高手如何处理这种问题代码: private void StartListening()
        {
            IPAddress ipadddress = IPAddress.Parse("192.168.0.6");
            TcpListener listener = new TcpListener(ipadddress, port);
            listener.Start();
            textBox.Text = "开始监听";
            while (true)
            {
                try
                {
                    if (listener.Pending())
                    {                        Socket s = listener.AcceptSocket();
                        clientsocket = s;
                        clientservice = new Thread(new ThreadStart(ServiceClient));
                        clientservice.Start();
                    }
                    else
                    {
                        Thread.Sleep(200);
                    }
                }
                catch (Exception ex)
                {
                    textBox.Text += ex.Message;
                }
            }
        }

解决方案 »

  1.   

    我看不出这部分代码有什么问题呢,只怕原因不能在这里找吧?
    提一点点代码上的建议。try模块放到循环体外或许效率会高些,另外那个if..else或者不用要也可以吧?
            private void StartListening()
            {
                IPAddress ipadddress = IPAddress.Parse("192.168.0.6");
                TcpListener listener = new TcpListener(ipadddress, port);
                listener.Start();
                textBox.Text = "开始监听";
                try
                {
                    while (true)
                    {
                        Socket s = listener.AcceptSocket();
                        clientsocket = s;
                        clientservice = new Thread(new ThreadStart(ServiceClient));
                        clientservice.Start();
                    }
                }
                catch (Exception ex)
                {
                    textBox.Text += ex.Message;
                }
            }
      

  2.   

    应该不是这里造成的,Socket s = listener.AcceptSocket();这个方法会等待客户端的接入。这样就不是一直执行的。
    建议你在
    if (listener.Pending())
                        {                        Socket s = listener.AcceptSocket();
                            clientsocket = s;
                            clientservice = new Thread(new ThreadStart(ServiceClient));
                            clientservice.Start(); sleep(0);//加上这句
                        }
      

  3.   

    1.StartListening()不是另开线程启动,所以容易死循环
    2.
    Lumisoft.net库 
    http://www.lumisoft.ee/lswww/Download/Downloads/ 
    和 
    土匪的IM、FTP库 
    http://www.cnblogs.com/dyj057/ 希望对你有帮助
      

  4.   

    各位大侠 我又检查了一下代码 我怀疑是接受 发送数据那块的事  请大侠们帮忙看看list是存socket对象的集合    如果我不调试的话   接受 发送数据没有问题  可是cpu达到100%
    假如调试的话   有时就会报出异常  异常的错误是:无法从传输连接中读取数据: 您的主机中的软件放弃了一个已建立的连接。。    请各位帮忙看看代码  客户端是flex
    private void ServiceClient()
            {
                Socket client = clientsocket;
                Byte[] bytes = new Byte[256];
                list.Add(client);
                string data = null;
                int i = 0;
                NetworkStream stream = new NetworkStream(client);
                //(i = stream.Read(bytes, 0, bytes.Length)) != 0
                while (true)
                {
                    try
                    {
                        i = stream.Read(bytes, 0, bytes.Length);
                        if (i == 0) continue;
                    }
                    catch (Exception ex)
                    {
                        textBox.Text += "\n" + ex.Message;
                    }
                    data = System.Text.Encoding.GetEncoding("gb2312").GetString(bytes, 0, i);
                    if (data == "<policy-file-request/>\0" || data == "<POLICY-FILE-REQUEST/>\0")
                    {
                        if (list.Count > 0) list.RemoveAt(list.Count - 1);
                        string xmlS = "<cross-domain-policy>" +
                         "<allow-access-from domain=\"*\" to-ports=\"843-14000\" />" +
                         "</cross-domain-policy>\0";                    byte[] msg2 = System.Text.Encoding.Default.GetBytes(xmlS);
                        client.Send(msg2, msg2.Length, 0);
                        //stream.Write(msg2, 0, msg2.Length);
                        //stream.Flush();
                    }
                    else
                    {
                        byte[] msg = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data);
                        for (int j = 0; j < list.Count; j++)
                        {
                            try
                            {
                                list[j].Send(msg, msg.Length, 0);
                            }
                            catch (Exception ex)
                            {
                                list.Remove(client);
                            }
                        }
                    }
                }            client.Close();
            }
      

  5.   

    这样啊,我发现你的代码中存在一些无效代码——最后一句的
    client.Close();为什么无效呢?因为你这句话写在while()块之外的,而while又是永远不会终结的while(true)恒真。
    我没有看到你这个函数中的第一句那个socketClient是怎么来的,所以不知道你那个client.Send()会有什么问题。出现你说的那个报异常的问题可能在于你else块中的try和catch。在catch中你将当前的client删除掉了(我理解为此处删除就等于服务器中与这个client断开了连接),然后你再用client.Send()就会报错吧!实在解决不了你可以私聊我帮你看下