我在做一个课题时候,使用服务器端和客户端通信,正常时候,两边都好好的。客户端不断的连接服务器,连接上后就开始发设定好的字符串。服务器端多线程接收这些字符
现在出现有个问题是,服务器端启用一个线程接收一个客户端的连接后,如果这个客户端突然掉线后,线程就卡在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!");
}
}
尽管TCP本身有keep-live的机制,类似于心跳电文,但是在很多都地方都不推荐使用,而且用起来都不太方便,所以如果有可能还是自己定义心跳电文吧。
对你说的“心跳报文机制”,不明白。
我就是想着在服务器端来一个tcp连接后,启动一个线程,然后和客户端通信,
如果客户端掉线,这个线程能自己结束
{
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;
}
bool keepalive = true; //循环条件
while (keepalive)
{
try
{
读取数据
}
catch (Exception ex)
{
Console.WriteLine("接受消息失败!" + ex.Message);
}
keepalive = false;
socket.Close();
clientThread.Abort(); //强制结束这个新线程
} }