日期:2014-05-17  浏览次数:20775 次

写socket通信的线程的问题
初学者,试写socket服务器,涉及到线程这块估计处理的不是很好,导致只要两三个用户连接的话cpu就占用百分之七八十了,不知道哪里出错了,求指导,只有20分了谢谢

想法就是开个监听的线程,来一个连接就开个线程去处理,

//监听线程
        private void StartListen()
        {
            listener = new TcpListener(ipep);
            listener.Start();
            while (true)
            {
                Socket clientSocket = listener.AcceptSocket();
                Thread clientThread = new Thread(new ParameterizedThreadStart(SocketWork));
                CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
                clientThread.IsBackground = true;
                clientThread.Start(clientSocket);
            }
        }


//处理每个用户的线程
并把连接的socket的名字信息和线程信息保存在一个arraylist中
        private void SocketWork(object objSocket)
        {
            Socket socket = (Socket)objSocket;

            //
//省略中间收发的代码
//

Client cl = new Client(clientName, socket.RemoteEndPoint, socket, Thread.CurrentThread);
            clientList.Add(cl);


        }


当用户离线时需要关闭该用户的线程
但我调试的时候发现,每次有客户端离线,线程好像关闭不掉,不知道我这种关闭的方法是否正确
        private void Gone(string str, Socket socket)
        {
            string[] token = str.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
            string name = token[1];
            Client cl=null;
            foreach (object obj in clientList)
            {
                Client c = (Client)obj;
                if (c.Name != name)
                {
                    SendMsgToClient.Send(c, str);//发