我做了一个模拟“多客户端--单服务器”的程序,客户端循环创建10个IdTcpClient,并指定其端口和IP地址,第一次运行时不会出错,当断开连接后也就是释放资源,重新再次创建10个idTcpClient的时候就会出错,报:socket error #10048 address already in use,也找了一些资料,但是不是太清除,部分代码如下,请各位大哥大姐们帮忙,先谢谢各位了。
客户端:
//--创建的10个TIdTcpClient,连接服务器
procedure TForm1.btn_LinkClick(Sender: TObject);
var
i : Integer;
begin
for i:=0 to 0 do
begin
try
application.ProcessMessages;
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'正在连接服务器!';//--提示信息
idtcpclnt := TIdTCPClient.Create(nil);
idtcpclnt.BoundIP := '192.168.0.113';//--指定客户端的Ip地址
idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
ReceiveThread := TReceiveThread.create(LB_Content,idtcpclnt,true);//--接收线程用于从服务器端接受数据
ReceiveThread.localIp := '192.168.0.113';//--接收线程的标识
ReceiveThread.localPort := 2000+i; idtcpclnt.Host := '127.0.0.1';//--服务器ip地址
idtcpclnt.Port := 2003;//--服务器port
idtcpclnt.Connect();
fIdTcpClientList.Add(Pointer(idtcpclnt));//--fIdTcpClientList用于保存创建的IdTcpClient
ReceiveThread.Resume;
fReceiveThreadList.Add(ReceiveThread);//--fReceiveThreadList保存接受线程。
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器完成!';//--显示信息
except
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器失败!';
end;
end;
end;//断开连接
procedure TForm1.btn_disLinkClick(Sender: TObject);
var
i : Integer;
begin
for i:= 0 to fReceiveThreadList.Count-1 do
begin
if ((TReceiveThread(fReceiveThreadList.Items[i]))<> nil) and (TIdTCPClient(fIdTcpClientList.Items[i])).Connected then
begin
(TReceiveThread(fReceiveThreadList.Items[i])).Resume;
(TReceiveThread(fReceiveThreadList.Items[i])).Terminate;
(TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect;
(TIdTCPClient(fIdTcpClientList.Items[i])).Free;
end;
end;
fReceiveThreadList.Clear;
fIdTcpClientList.Clear;
end;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?
客户端:
//--创建的10个TIdTcpClient,连接服务器
procedure TForm1.btn_LinkClick(Sender: TObject);
var
i : Integer;
begin
for i:=0 to 0 do
begin
try
application.ProcessMessages;
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'正在连接服务器!';//--提示信息
idtcpclnt := TIdTCPClient.Create(nil);
idtcpclnt.BoundIP := '192.168.0.113';//--指定客户端的Ip地址
idtcpclnt.BoundPort := 2000+i;//--指定客户端的port号
ReceiveThread := TReceiveThread.create(LB_Content,idtcpclnt,true);//--接收线程用于从服务器端接受数据
ReceiveThread.localIp := '192.168.0.113';//--接收线程的标识
ReceiveThread.localPort := 2000+i; idtcpclnt.Host := '127.0.0.1';//--服务器ip地址
idtcpclnt.Port := 2003;//--服务器port
idtcpclnt.Connect();
fIdTcpClientList.Add(Pointer(idtcpclnt));//--fIdTcpClientList用于保存创建的IdTcpClient
ReceiveThread.Resume;
fReceiveThreadList.Add(ReceiveThread);//--fReceiveThreadList保存接受线程。
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器完成!';//--显示信息
except
Stat.Panels.Items[1].Text := 'idtcpclnt'+inttostr(i)+'连接服务器失败!';
end;
end;
end;//断开连接
procedure TForm1.btn_disLinkClick(Sender: TObject);
var
i : Integer;
begin
for i:= 0 to fReceiveThreadList.Count-1 do
begin
if ((TReceiveThread(fReceiveThreadList.Items[i]))<> nil) and (TIdTCPClient(fIdTcpClientList.Items[i])).Connected then
begin
(TReceiveThread(fReceiveThreadList.Items[i])).Resume;
(TReceiveThread(fReceiveThreadList.Items[i])).Terminate;
(TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect;
(TIdTCPClient(fIdTcpClientList.Items[i])).Free;
end;
end;
fReceiveThreadList.Clear;
fIdTcpClientList.Clear;
end;
第一次连接服务器时,没问题,当断开再连接时就会报错误,请问该怎么解决?
for i:=0 to 9 do
begin
idtcpclientlist[i]:=TIdTcpClient.Create( Owner );
...............
end;
for i:=9 downto 0 do
begin
idtcpclientlist[i].disconnect;
idtcpclientlist[i].free;
end;
不好意思,我试过你的方法了,不行的,还是那个错误。
这个不指定.
是要指定的
我已经释放IdTcpClient了,
(TIdTCPClient(fIdTcpClientList.Items[i])).Disconnect;
(TIdTCPClient(fIdTcpClientList.Items[i])).Free;
我是释放后,再次重连时发生的错误,请问如何释放端口资源?to:Brightyang
我刚接触socket通信不久,不知道你说的正确答案指的什么,还望赐教!
释放的时候 for i:=9 downto 0 do