我用Internet栏中上述两控件在写一网络五子棋
form1为五子棋界面,form2为选择作为服务机监听或者作为客户机进行连接的设置界面
procedure TForm2.Button1Click(Sender: TObject); //监听即作为服务机
begin 
 with form1 do begin
 ClientSocket.Active :=False;
 ServerSocket.Active :=True;
 end;
end;
procedure TForm2.Button2Click(Sender: TObject); //作为客户端连接
begin
remote_ip:=maskedit1.text;
conn(remote_ip); 
end;procedure conn(server:string);
begin
with form1 do begin
ClientSocket.Active:=False;
ClientSocket.Host:=server;  //server为监听方的ip
ClientSocket.Active:=True; 
end;
end;以上代码连接一切正常,但当我要重新连接时,双方都先执行reconn()//中断原有连接,再打开form2(如上面代码的设置界面)procedure reconn();//关闭原有连接
begin
with form1 do begin
if IsServer then //判断是否作为服务机
serverSocket.active:=false  //serversocket.close也试过了
else
ClientSocket.active:=false;  //clientsocket.close也试过了
form2.ShowModal;
end;
end;这时服务方重新点击监听即procedure TForm2.Button1Click(Sender: TObject);
似乎监听没有问题,而客户端则无法连接上,表现为点procedure TForm2.Button2Click没反应
包括ClientSocketConnecting事件都没有响应。除非把运行客户端的程序关闭,再重新打开一个作为客户端进行连接,则又和最上面的代码一样正常。
请问是什么回事,是否我关闭连接时出错了?还有serversocket.active:=false
和serversocket.close 有什么区别,在reconn()过程中,我两种都试了。
但都是不能再次连接(除非重新运行该程序并点连接即procedure TForm2.Button2Click就能进行连接)
谢谢!!!
没多少分可给了,望见谅。顺便问下分数要过多久才会增长~

解决方案 »

  1.   

    补充说明一下,我试验后觉得可能是clientsocket.active:=false和clientsocket.close根本就没有关闭clientsocket
    因为我在ServerSocket和ClientSocket的onDisconnect都有用showmessage在失去连接时提示。
    结果当服务端执行ServerSocket.Active:=FALSE后,客户端ClientSocketDisconnect这边有弹出提示。而当客户端这边执行Clientsocket.active:=false后,服务方的ServerSocketClientDisconnect并没有触发,直到我关了运行ClientSocket的客户端程序,服务方才弹出提示。为什么ServerSocket.active:=false能成功关闭,而ClientSocket.active:false不能关闭呢?谢谢!
      

  2.   

    ServerSocket没有必要关闭
    你说的那个问题好象没有遇到过
    close 和active没有什么区别,都是关闭socket用的
    另外你的机器是不是问题
    重连的时候没有onerror事件发生?
      

  3.   

    机器应该没问题吧~ 
    正常连接都没问题呀。
    就是服务端关闭时ClientSocketDisconnect有反应
    但反之客户端关闭时,ServerSocketClientDisconnect并没有触发
    直到直接壮志凌云客户端所在程序,对方的ServerSocketClientDisconnect才触发