IndyTcp线程连接客户端关闭报错!求教,感谢 ( 积分: 51 )

  • 主题发起人 主题发起人 spary123
  • 开始时间 开始时间
S

spary123

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.serverConnect(AThread: TIdPeerThread);
begin
recordlist.Items.Add('来自主机'+AThread.Connection.Socket.Binding.PeerIP+

AThread.Connection.Socket.LocalName+'的请求已被接纳!');
end;
procedure TForm1.serverExecute(AThread: TIdPeerThread);
var
ipdatalength :integer;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
if AThread.Connection.ReadCardinal = $ffffffff then
begin
ipdatalength:= AThread.Connection.ReadInteger(false);
AThread.Connection.ReadBuffer(recv,ipdatalength-8);
datadisplay; //显示数据
end;
end;
end;
procedure TForm1.serverDisconnect(AThread: TIdPeerThread);
begin
recordlist.Items.Add('连接已经断开!'); //recordlist为Tlistbox
end;
我用的INDYTCPServer(INDY9)
1在非调试环境下运行,服务器接收来自客户端的数据包并显示。服务器端程序运行
第一次客户端程序运行,服务器程序能够正常显示客户端的连接信息并显示数据。关闭客户端后触发Disconnect事件,显示“连接已经断开!”,没有报错(在调试环境下回报错socket error #10054)。第二次客户端程序运行,服务器程序能够正常显示客户端的连接信息“来自主机×××的请求已被接纳!”,客户端发送数据后,服务器程序不能显示数据。之后关闭服务器程序,会报一个错,APPlication ERROR EIdTerminateThreadTimeout in module Projeet1.exe.这是什么原因?

2客户端关闭后,服务器端程序应该关闭在当初客户端连接时服务器端程序为其建立的线程吧。客户端关闭触发Disconnect事件,这个事件有一个参数AThread,是那个当初客户端连接时服务器端程序为其建立的线程吗?如果是我用AThread.terminate;AThread.data=nil;应该可以关闭吧(好像也有点问题)。如果不是,怎么关闭那个线程呢?
感谢!!!
 
1、Server關閉前,請先手動斷開所有的連接,否則會報EIdTerminateThreadTimeout的錯(這個錯誤很多次人問了),你在讀數據的時候最好用上TRY,不要以為判斷了一下就OK;
2、正常情況下客戶端斷開時,服務器的對應線程會自動銷毀(正常情況是指:1、網絡正常斷開,2、你沒有用線程池)。
 
谢谢,
第一个问题中,“第二次客户端程序运行,服务器程序能够正常显示客户端的连接信息“来自主机×××的请求已被接纳!”,客户端发送数据后,服务器程序不能显示数据。”这是什么原因呢?
 
这个问题就还不是很清楚了,不知你CLIENT端是怎么发的,不好判断。
 
后退
顶部