写socket通信的线程的问题

bluesands_zhang 2013-04-15 02:08:52
初学者,试写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
...全文
219 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesands_zhang 2013-04-16
  • 打赏
  • 举报
回复
引用 8 楼 xggllc 的回复:
对,线程就是从上到下执行一次,这中间如果有循环它会把循环走完,如果没循环,这线程走完后就会自动释放线程的资源。 引用 7 楼 bluesands_zhang 的回复:引用 6 楼 xggllc 的回复:有一个 睡眠函数 ,Sleep() 你放到 循环里面 , 对于线程的关闭,不建议手动关闭,如果可能的话让线程自动走完,那样程序会自动释放一些资源, 比如 whi……
谢谢
xggllc 2013-04-16
  • 打赏
  • 举报
回复
对,线程就是从上到下执行一次,这中间如果有循环它会把循环走完,如果没循环,这线程走完后就会自动释放线程的资源。
引用 7 楼 bluesands_zhang 的回复:
引用 6 楼 xggllc 的回复:有一个 睡眠函数 ,Sleep() 你放到 循环里面 , 对于线程的关闭,不建议手动关闭,如果可能的话让线程自动走完,那样程序会自动释放一些资源, 比如 while (true) 这里 定义一个 bool变量来控制它循环,关闭线程得时候flase,线程走完自动就关闭了。 你的意思是说线程调用的那个方法走完了就会自动结束线程,……
bluesands_zhang 2013-04-16
  • 打赏
  • 举报
回复
引用 6 楼 xggllc 的回复:
有一个 睡眠函数 ,Sleep() 你放到 循环里面 , 对于线程的关闭,不建议手动关闭,如果可能的话让线程自动走完,那样程序会自动释放一些资源, 比如 while (true) 这里 定义一个 bool变量来控制它循环,关闭线程得时候flase,线程走完自动就关闭了。
你的意思是说线程调用的那个方法走完了就会自动结束线程,并释放资源?
xggllc 2013-04-15
  • 打赏
  • 举报
回复
有一个 睡眠函数 ,Sleep() 你放到 循环里面 , 对于线程的关闭,不建议手动关闭,如果可能的话让线程自动走完,那样程序会自动释放一些资源, 比如 while (true) 这里 定义一个 bool变量来控制它循环,关闭线程得时候flase,线程走完自动就关闭了。
bluesands_zhang 2013-04-15
  • 打赏
  • 举报
回复
引用 4 楼 GT7466 的回复:
引用 1 楼 bdmh 的回复:StartListen是主进程的吗,里面有while true,这个把cpu占满了 listener.AcceptSocket 会阻塞主线程。 1. arraylist clientList是否有多线程处理机制? 2.如果有很多连接,不要针对每个请求开一个线程,可以用一个线程来循环处理。 3.对clientList里的so……
有没有相关的例子,不知道怎么来循环处理
GT7466 2013-04-15
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
StartListen是主进程的吗,里面有while true,这个把cpu占满了
listener.AcceptSocket 会阻塞主线程。 1. arraylist clientList是否有多线程处理机制? 2.如果有很多连接,不要针对每个请求开一个线程,可以用一个线程来循环处理。 3.对clientList里的sockets也可以统一用一个线程来处理释放。
bluesands_zhang 2013-04-15
  • 打赏
  • 举报
回复
其中有一个疑问就是在方法里怎么将调用该方法的线程保存起来,用currentthread可以?
bluesands_zhang 2013-04-15
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
StartListen是主进程的吗,里面有while true,这个把cpu占满了
这个不是主线程,一开始就开的一个监听的线程 listenThread = new Thread(new ThreadStart(StartListen));
bdmh 2013-04-15
  • 打赏
  • 举报
回复
StartListen是主进程的吗,里面有while true,这个把cpu占满了

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧