ClientSocket 再次连接的问题(100分)

  • 主题发起人 主题发起人 xwm2k
  • 开始时间 开始时间
X

xwm2k

Unregistered / Unconfirmed
GUEST, unregistred user!
我用控件TClientSocket去连接服务端,非阻塞方式
第一次ClientSocket1.Active := True是成功的
当我需要断开,执行 ClientSocket1.Active := False 后,
再次需要连接,执行 ClientSocket1.Active := True 后,值仍然是false,也没捕捉到错误,
只有再次 执行ClientSocket1.Active := True才会成功,奇怪!

我用阻塞方式时没有这个问题,但OnRead上又不能读到消息,需要另外写线程去接收.

请各位大侠出手!
 
使用ClientSocket1.Close试试,我经常使用,没问题。
 
谢谢skadon
我用了CientSocket1.Close;效果还是一样
 
SeatClientSocket.Close;后

需要open吗?

我直接用的SeatClientSocket.Active := True;
先Open 好像也不行
 
非阻塞模式下,ClientSocket1.Active := True执行后立即返回,
只有收到服务端消息才有可能ClientSocket1.Active 为 True
 
感谢zhukewen!
我第一次连接时总是成功的,再次连接则会有这个问题,我怎么做才能收到服务端的响应呢?(达到效果与阻塞模式一致)否则,我总要两次才能连接上。
 
这样的情况,我试了没有啊,你把你写的代码,我看一下,如果方便的话
 
为什么我把客户机的连接和发送信息放在一个过程中,服务器接收不到信息,而放在两个过程中又是正常的?
 
这个不可能,我今天还在做SGIP的时候用呢
 
感谢各位的支持,我将源码部分贴上来,请各位大侠继续支持:
(ClientSocket1为非阻塞,好像阻塞方式没这个问题,但我的应用用阻塞方式较难处理,需要开一个线程去不断接收,而阻塞方式会将我阻塞到那里。)


procedure TMainForm.LoginClick(Sender: TObject);
begin
if (not LoginForm.Visible) and (LoginForm.ShowModal = mrOK) then
begin

if Trim(LoginForm.SystemID.Text) = '' then
begin
Application.MessageBox('请输入操作员号','提示',MB_OK);
LoginClick(Sender);
end;

//建立连接
if ClientSocket1.Active = false then
begin
try
// ClientSocket1.Active := True;
ClientSocket1.Open;
except
end;
end;

//当服务端关闭后再打开,在客户端执行LoginClick,第一次会执行到 '登录失败,请检查通讯'
// 再执行LoginClick,则在'建立连接'时,就已经是ClientSocket1.Active = True

if ClientSocket1.Active = false then
begin
// '登录失败,请检查通讯';
exit;
end;
end;
end;
 
看来大家还是面向过程开发。。。[:D]
 
这个问题以前讨论过很多次了,不是什么两次连接问题,ClientSocket是异步方式,
连接失败是OnError事件理,连接成功要再OnConnected事件理处理
 
无忌GG 重出江湖!
欢迎欢迎!
 
感谢各位!
 
后退
顶部