出现的问题是 
客户端连服务端多线程(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。没有经验,。谢谢大家
各位高手希望能给一点提示 ,最好是在服务器端能检测到客户端已经断开
然后把该客户端的线程给关闭

解决方案 »

  1.   

    http://topic.csdn.net/t/20041212/21/3638505.html
    Socket 编程经验谈---如何处理socket连接后服务器端或客户端的断开
      

  2.   

    建议用异步监听和异步连接方式。并且注意在catch后,关闭socket.close()  退出时socket.shutdown()
      

  3.   

    对。还是用异步的好。同步就要考虑lock问题。而且while(true)本来就是个死循环。
      

  4.   

    服务侦听程序没有问题,问题在你的serviceclient()函数里面,为何cpu100%,要么进入死循环,要么要使用的资源lock了,建议先在serviceclient里面加try catch,错误就Thread.Abort客户端断开服务器端检测不到这种情况我也遇到过,比较奇怪
      

  5.   

    如果出现问题就  Thread.Abort
    那这个thread 里面的socket 也会跟着关闭吗?
      

  6.   

    把你的while(true)改称参数while(balive),客户端断后,balive=false退出线程