tcpclient 如何知道客户端掉线?

xkx2003 2008-09-27 03:02:33

我在做一个课题时候,使用服务器端和客户端通信,正常时候,两边都好好的。客户端不断的连接服务器,连接上后就开始发设定好的字符串。服务器端多线程接收这些字符
现在出现有个问题是,服务器端启用一个线程接收一个客户端的连接后,如果这个客户端突然掉线后,线程就卡在stream.Read(bytes, 0, bytes.Length),这个线程也不退出。

下面是服务器端代码,
class MyServer
{
static TcpClient st_client;
static Thread clientservice;
public static void Main()
{
TcpListener server = null;

try
{
Int32 port = 6001;
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
IPAddress localAddr = ieh.AddressList[0];
server = new TcpListener(localAddr, port);
server.Start();
while (true)
{
Console.Write("Waiting for a connection... ");
st_client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{

server.Stop();
}
}
private static void ServiceClient()
{
Console.WriteLine("In Thread!");
TcpClient client = st_client;
Byte[] bytes = new Byte[1024];
String data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
Console.WriteLine("stream.Read {0}",i);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);

}
client.Close();
Console.WriteLine("Out Thread,Disconnected!");
}

}




...全文
294 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
woaixueyu 2008-09-28
  • 打赏
  • 举报
回复
楼主可以这样尝试下:


bool keepalive = true; //循环条件


while (keepalive)
{
try
{
读取数据
}
catch (Exception ex)
{
Console.WriteLine("接受消息失败!" + ex.Message);
}
keepalive = false;
socket.Close();
clientThread.Abort(); //强制结束这个新线程
}

}
xhueducls 2008-09-28
  • 打赏
  • 举报
回复
定时发送数据包信息给服务器,如果超时则断线,就是心跳包
gaocumt 2008-09-28
  • 打赏
  • 举报
回复
心跳包.
xkx2003 2008-09-27
  • 打赏
  • 举报
回复
是有个connected属性,但是线程主要时间都是在stream.Read这里,客户端掉线时间也一般都是发生在这里

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
Console.WriteLine("stream.Read {0}",i);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
if(client.connected = false) break;
}
wdgphc 2008-09-27
  • 打赏
  • 举报
回复
好像有个Connected 属性吧,如果是false就关闭连接.
xkx2003 2008-09-27
  • 打赏
  • 举报
回复
回phy
对你说的“心跳报文机制”,不明白。
我就是想着在服务器端来一个tcp连接后,启动一个线程,然后和客户端通信,
如果客户端掉线,这个线程能自己结束
brallow 2008-09-27
  • 打赏
  • 举报
回复
在TCP通信的过程中最好是有固定的心跳报文机制,通过这种机制来检测TCP连接是否畅通,其它方法在.NET均不能很好的检测连接的中断。
尽管TCP本身有keep-live的机制,类似于心跳电文,但是在很多都地方都不推荐使用,而且用起来都不太方便,所以如果有可能还是自己定义心跳电文吧。

110,559

社区成员

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

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

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