socket 循环多线程造成cpu100%

wudiqiang2046 2009-12-14 03:28:33
最近稍微接触了点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;
}
}
}
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
INTTNY 2009-12-18
  • 打赏
  • 举报
回复
这样啊,我发现你的代码中存在一些无效代码——最后一句的
client.Close();

为什么无效呢?因为你这句话写在while()块之外的,而while又是永远不会终结的while(true)恒真。
我没有看到你这个函数中的第一句那个socketClient是怎么来的,所以不知道你那个client.Send()会有什么问题。

出现你说的那个报异常的问题可能在于你else块中的try和catch。在catch中你将当前的client删除掉了(我理解为此处删除就等于服务器中与这个client断开了连接),然后你再用client.Send()就会报错吧!实在解决不了你可以私聊我帮你看下
wudiqiang2046 2009-12-17
  • 打赏
  • 举报
回复
我在顶
wudiqiang2046 2009-12-17
  • 打赏
  • 举报
回复
我在顶 天天顶
wudiqiang2046 2009-12-16
  • 打赏
  • 举报
回复
dreamsnake 2009-12-16
  • 打赏
  • 举报
回复
考虑加个休眠吧。哪些只有 1 毫秒,情况也会改善很大的。
wudiqiang2046 2009-12-16
  • 打赏
  • 举报
回复
各位大侠 我又检查了一下代码 我怀疑是接受 发送数据那块的事 请大侠们帮忙看看

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();
}

wudiqiang2046 2009-12-16
  • 打赏
  • 举报
回复
我顶
wangkuang5 2009-12-14
  • 打赏
  • 举报
回复
1.StartListening()不是另开线程启动,所以容易死循环
2.
Lumisoft.net库
http://www.lumisoft.ee/lswww/Download/Downloads/

土匪的IM、FTP库
http://www.cnblogs.com/dyj057/

希望对你有帮助
zhulinxiaofeng 2009-12-14
  • 打赏
  • 举报
回复
应该不是这里造成的,Socket s = listener.AcceptSocket();这个方法会等待客户端的接入。这样就不是一直执行的。
建议你在
if (listener.Pending())
{

Socket s = listener.AcceptSocket();
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();

sleep(0);//加上这句
}
woshifou 2009-12-14
  • 打赏
  • 举报
回复
学习。
INTTNY 2009-12-14
  • 打赏
  • 举报
回复
我看不出这部分代码有什么问题呢,只怕原因不能在这里找吧?
提一点点代码上的建议。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;
}
}
wjmfootball 2009-12-14
  • 打赏
  • 举报
回复
jgj
wudiqiang2046 2009-12-14
  • 打赏
  • 举报
回复
我顶

111,120

社区成员

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

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

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