出现的问题是
客户端连服务端多线程(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。没有经验,。谢谢大家
各位高手希望能给一点提示 ,最好是在服务器端能检测到客户端已经断开
然后把该客户端的线程给关闭
客户端连服务端多线程(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。没有经验,。谢谢大家
各位高手希望能给一点提示 ,最好是在服务器端能检测到客户端已经断开
然后把该客户端的线程给关闭
Socket 编程经验谈---如何处理socket连接后服务器端或客户端的断开
那这个thread 里面的socket 也会跟着关闭吗?