客户端连服务端多线程(TCP连接),客户端断开连接后服务端CPU占用100%

flybirdlc 2006-12-19 01:08:13
出现的问题是
客户端连服务端多线程(TCP连接),客户端断开连接后服务端CPU占用100%
我想让服务端在5分钟没有收到客户短的信息的话就关闭连接,
请问各位高手有没有什么好办法,。
我没想到在服务端如何控制
但是我在客户端的控制是,记录发送最近一条信息的时间
然后用 一个 timer 计时器。通过事件调用.每60秒测试一次当前时间距离最后一条信息的时间是不是超过了 5分钟,如果超过5分钟就关闭连接和流
但是当我关闭流的时候
服务端CPU占用率就 100%了
我感觉问题是在服务端的流read的时候出现的。
部分代码如下:


客户端连接服务端。采用 TCP连接
服务端在accept 到一个socket 后
建立一个线程 处理客户端的数据
处理部分代码如下

private void starlis() //开始监听,等待客户连接
{
tcplst = new TcpListener(this.serv);
tcplst.Start(); //开始监听

while(true)
{
sock = tcplst.AcceptSocket();
this.clientser = new Thread(new ThreadStart(serviceclient)); //增加一个接受客户段信息的线程
clientser.Start(); //转到处理方法
}
}

private void serviceclient() //接到连接后处理
{

Socket cc = this.sock;
if(cc.Connected)
{
net = new NetworkStream(cc); //实例化网络流 ,准备读取客户断发送到服务器的信息
StreamReader sr = new StreamReader(net);

this.sendWelcomeMsg(cc,this.linkopen);

ClientInfo cli = new ClientInfo(); //实例一个客户端信息
cli.setSock = cc;
cli.setConTime = System.DateTime.Now.ToString();
string data = null;

while(cc.Connected)
{
try
{

data = sr.ReadLine();


}
catch(Exception e)
{
e.ToString();
}
}

}
}


下面是客户端连接 和 超时后断开的代码!

1.客户端连接的代码
try
{
ip = IPAddress.Parse(serverIp);
servIP = new IPEndPoint(ip,Convert.ToInt32(serverPort));
clientTcp = new TcpClient();
clientTcp.Connect(servIP);
this.revice = new Thread(new ThreadStart(recivemsg));
net = clientTcp.GetStream();
revice.Start();
}
catch(Exception er)
{
MessageBox.Show("服务器连接错误");
}


2.超时后的处理代码(略过时间计算)

this.nowTime = System.DateTime.Now; //获取当前时间
TimeSpan ts = this.nowTime - this.oldTime; //当前时间减最后发的一条信息时间
int onLineMin = ts.Minutes; 获取中间的分钟差
if(onLineMin > 5) //如果超时。则断开连接
{
this.clientTcp.Close(); //就是这里出了问题,我不晓得为什么,
sr.Close(); //在执行了clientTcp.Close()后服务端依然可以检测到客户端,并且可以收到客户端发送的信息,那要断开什么才检测不到呢?,但是在执行了sr.close()之后,服务端CPU占用就 100%了,请问下如何断开才对呢?
net.Close();
revice.Abort(); //关闭线程(好象依然关闭不掉流)
}

谢谢各位高手。。我是第一次搞tcp。没有经验,。谢谢大家
各位高手希望能给一点提示 ,最好是在服务器端能检测到客户端已经断开
然后把该客户端的线程给关闭
...全文
687 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
mabaolin 2006-12-20
  • 打赏
  • 举报
回复
通过线程配合状态图的方法做.

zhuds 2006-12-20
  • 打赏
  • 举报
回复
把你的while(true)改称参数while(balive),客户端断后,balive=false退出线程
bigrongshu 2006-12-19
  • 打赏
  • 举报
回复
服务侦听程序没有问题,问题在你的serviceclient()函数里面,为何cpu100%,要么进入死循环,要么要使用的资源lock了,建议先在serviceclient里面加try catch,错误就Thread.Abort

客户端断开服务器端检测不到这种情况我也遇到过,比较奇怪
kason_j 2006-12-19
  • 打赏
  • 举报
回复
路過,幫頂
flybirdlc 2006-12-19
  • 打赏
  • 举报
回复
请问一下各位大哥。
如果不采用异步连接收法数据的话
有什么办法在服务端能限制客户端如果 5分钟内没有发送数据 就把他踢掉??
在线等 !!!
马上结贴~~~
liuchao305 2006-12-19
  • 打赏
  • 举报
回复
对。还是用异步的好。同步就要考虑lock问题。而且while(true)本来就是个死循环。
harvesthouhao 2006-12-19
  • 打赏
  • 举报
回复
建议用异步监听和异步连接方式。并且注意在catch后,关闭socket.close() 退出时socket.shutdown()
zhaochong12 2006-12-19
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20041212/21/3638505.html
Socket 编程经验谈---如何处理socket连接后服务器端或客户端的断开
flybirdlc 2006-12-19
  • 打赏
  • 举报
回复
如果出现问题就 Thread.Abort
那这个thread 里面的socket 也会跟着关闭吗?

110,525

社区成员

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

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

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