TServerClientThread线程起来后,当客户端断链时,如何停止?(100分)

  • 主题发起人 主题发起人 2373088
  • 开始时间 开始时间
2

2373088

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在ServerSocket编程中自创建TServerClientThread进行接收和发送数据时发现,
客户端链接后,线程自动创建,但客户端断链时,线程却照样在运行,请问如何停止?
即要求当无客户端链接时,线程自动停止不占用系统资源。
主要原代码如下:
type
TSctRecv = class(TServerClientThread)
private
protected
procedure execute;override;
procedure ClientExecute;override;
end;
var
SctRecv:TSctRecv;

OnGetThread事件:
SctRecv:=TSctRecv.Create(False,ClientSocket); //创建线程
SctRecv.Priority:= tpIdle;
SocketThread := SctRecv;

procedure TSctRecv.Execute;
begin
repeat
synchronize(ClientExecute); //同步线程
until terminated;
end;

procedure TSctRecv.ClientExecute;
begin
..............
end;
拜托各位大虾尽快进行指点。
 
服务器上每次和客户收发数据都记录时间(就是最后一次活动时间了),
创建一个timer,检查最后一次活动是什么时候,如果时间超过
你的设定值,服务器就主动关闭。
(就如同ftp服务器,如果你连上去长时间都不发命令,服务器会主动
断开和你的连接)
(用这种方法,如果线没断,但是客户端一直沉默,也会断开)
(线断开,和客户端一直沉默是基本相同的,除非你的服务器会主动发信息
给客户端)

 
Pipi.,难道只有采用你这种方法吗?现在归根的问题还是,在server里面如何侦测
Client断掉。
 
如果客户段正常断开,服务器端也会关闭socket。
如果客户端死机、或者网络短,你的服务器又没发信息去客户端,服务器是不知道的。
不过,如果客户段正常断开,你查到线程数量还是那么多是正常的。
socket关闭,但是创建的线程还是会存在,放在缓冲池等下一个socket利用他
(这样不必重复建、删线程,提高效率)
 
我还是想知道Server端servertypes为tThreadBlocking时,与server
端链接的client断链时,server端会有什么反应。
 
用TWinSocketStream试试。
CLIENTTIMEOUT定义客户端连接超时时间。
void __fastcall TServerSocketThread::ClientExecute() {
TWinSocketStream *pStream;
pStream = new TWinSocketStream(ClientSocket, CLIENTTIMEOUT);
while (!Terminated && ClientSocket->Connected) { // 确定连接正常
if (pStream->WaitForData(CLIENTTIMEOUT)) { // 客户有数据
.
.
.
} else // 客户超时
break;
}
}
 
我也想知道,我按照几位大虾的指点,未果。
 
认真看看TWinSocketStream的说明,就“果”了。
 
多人接受答案了。
 
能问问问题到底怎么解决的吗?
 
后退
顶部