这个问题困扰我好久了,客户端未连接时不报错,一旦客户端连接后退出就报错!看过网上的一些贴子,好像不起作用!
为了更好说明,我将IdTCPServer的事件代码贴在下面,望各位高手提供解决方法,分不够可以再加!先谢谢了!!
procedure Tmainf.IdTCPServer1Execute(AThread: TIdPeerThread);
var
//
begin
AThread.Connection.ReadBuffer(ctext, sizeof(ctext));
case ctext.command of
Clogin: //登陆
begin .. end;
Creg: //注册
begin .. end
..
end
procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
begin
if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;procedure Tmainf.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
mainctrl.deleonline(AThread);//删除在线用户
DisConn(AThread); //用于处理客户端退出,以及往界面上的memo中加日志
//这二个过程不执行也同样报错!
end;
为了更好说明,我将IdTCPServer的事件代码贴在下面,望各位高手提供解决方法,分不够可以再加!先谢谢了!!
procedure Tmainf.IdTCPServer1Execute(AThread: TIdPeerThread);
var
//
begin
AThread.Connection.ReadBuffer(ctext, sizeof(ctext));
case ctext.command of
Clogin: //登陆
begin .. end;
Creg: //注册
begin .. end
..
end
procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
begin
if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;procedure Tmainf.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
mainctrl.deleonline(AThread);//删除在线用户
DisConn(AThread); //用于处理客户端退出,以及往界面上的memo中加日志
//这二个过程不执行也同样报错!
end;
AException: Exception);
begin
if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;你把这个事件中的代码去掉 不要执行这个事件 看看可以不可以~~~
谢谢你的建议!
你说的方法不管用,去掉这个事件还是同样的报错!
procedure Tmainf.IdTCPServer1Exception(AThread: TIdPeerThread;
AException: Exception);
begin
if AThread.Connection.Connected then AThread.Connection.Disconnect;
end;
Ctext的数据类型是枚举?记录?还是...
你可以这样测试一下:
AThread.Connection.ReadBuffer(ctext, sizeof(ctext));改为...
var
cText: string;
begin
ctext := AThread.Connection.ReadLn;
......处理cTextPS: 请把你现在的cText类型定义贴出来
TCommand = (CLogin, CReg);
TcText = packed record
Command: TCommand;
end;
TClientForm = class(TForm)
Button: TButton;
IdTCPClient: TIdTCPClient;
ButtonSend: TButton;
CheckBox: TCheckBox;
procedure ButtonClick(Sender: TObject);
procedure ButtonSendClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
ClientForm: TClientForm;implementation{$R *.dfm}procedure TClientForm.ButtonClick(Sender: TObject);
begin
IdTCPClient.Connect();
end;procedure TClientForm.ButtonSendClick(Sender: TObject);
var
cText: TcText;
begin
if CheckBox.Checked then
cText.Command := CLogin
else
cText.Command := CReg;
IdTCPClient.WriteBuffer(cText, SizeOf(cText));
end;。。TCommand = (Clogin, CReg);
TcText = packed record
Command: TCommand;
end;
TServerForm = class(TForm)
IdTCPServer: TIdTCPServer;
Memo: TMemo;
procedure IdTCPServerExecute(AThread: TIdPeerThread);
private
sCommandString: string;
public
{ Public declarations }
end;var
ServerForm: TServerForm;implementation{$R *.dfm}procedure TServerForm.IdTCPServerExecute(AThread: TIdPeerThread);
var
cText: TcText;
begin
AThread.Connection.ReadBuffer(cText, SizeOf(cText));
case cText.Command of
CLogin: Memo.Lines.Add('Login');
CReg: Memo.Lines.Add('Register');
end;
end;
const
Creg = 10001; //注册
Clogin = 10002; //登陆
多个客户端连接后,相互间无操作的情况下,立即退出不报错,但相互间发送消息,或者是其他操作后,退出则报这个错误。环境为delphi 7,网络控件为delphi7自带的IdTCPServer和IdTCPClient
获得线程的id后如下操作线程:
Athread.FreeOnterminated:=true(可以不要,因为indy在完成一个客户连接后,自动销毁线程)
Athread.connection.disconnect;(调用此事件,实际上就是告诉客户,将结束这个线程,indy会自动销毁)
try
Athread.WaitFor
except
end;(不如此,程序会报“句柄无效”的错误,因为此时indy可能已经结束了线程)//此时就可以终止服务器了
idTcpServer.Active:=false(调试时当然有异常,保护起来,脱离调试环境,运行程序,一切ok)
愿能帮得上你得忙◎!
我也碰到同样的问题,但装了9.0.18,问题同样有啊!这是我的代码,能帮帮我吗??
procedure TFrmMain.disAllconnect;
var
Place :integer;
VarTList :TList;
begin
VarTList:=Server.Threads.LockList;
for Place:=0 To VarTList.Count-1 Do
begin
try
TIdPeerThread(VarTList.Items[Place]).Connection.Disconnect;
TIdPeerThread(VarTList.Items[Place]).WaitFor;
except end
end;
end;
关闭时:
disAllconnect;
server.active :=false;