初学者,试写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);//发送到其他客户端告知有人离线
}
else
{
cl = c;
}
}
if (cl.CL_Thread.ThreadState == ThreadState.Running)
{
cl.CL_Thread.Abort();
}
clientList.Remove(cl);
DeleItem(name);
}
参考了这篇文章
http://blog.csdn.net/liguo9860/article/details/6148614
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);//发送到其他客户端告知有人离线
}
else
{
cl = c;
}
}
if (cl.CL_Thread.ThreadState == ThreadState.Running)
{
cl.CL_Thread.Abort();
}
clientList.Remove(cl);
DeleItem(name);
}
参考了这篇文章
http://blog.csdn.net/liguo9860/article/details/6148614
listenThread = new Thread(new ThreadStart(StartListen));
listener.AcceptSocket 会阻塞主线程。1. arraylist clientList是否有多线程处理机制?
2.如果有很多连接,不要针对每个请求开一个线程,可以用一个线程来循环处理。
3.对clientList里的sockets也可以统一用一个线程来处理释放。