clientsocket有关open的问题

mjtalhx 2009-07-08 08:42:55
由于是第一次开发有关网络通讯方面的,问大家一个简单的问题,我在使用clientsocket.open后要多写一句提示连接成功的对话框语句,这时候就可以正常通讯。但是要是把那句提示框的语句注释掉,就无法通讯,不知道问题在哪里?请高手指教。多谢了!
...全文
172 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
iuIRCClient 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jadeluo 的回复:]
clientsocket.open是个非阻塞函数, 调用之后(连接还未成功)立即返回并继续执行后续的指令。

多写一句提示连接成功的对话框语句,这就给出了足够的时间去完成连接,之后就可以正常通讯。

把那句提示框的语句注释掉,就无法通讯,因为连接还未成功。
[/Quote]

楼上分析的完全正确,这个问题不能用sleep来解决,
在open后,楼主就不应该再做任何后续操作了,请在ClientSocketOutCar的onConnect事件里写消息发送代码即可。

仔细看看ClientSocket的Help
iuIRCClient 2009-07-15
  • 打赏
  • 举报
回复

楼上分析的完全正确,这个问题不能用sleep来解决,
在open后,楼主就不应该再做任何后续操作了,请在ClientSocketOutCar的onConnect事件里写消息发送代码即可。

仔细看看ClientSocket的Help
sg_knight 2009-07-14
  • 打赏
  • 举报
回复
感觉还是延时的问题。延时足够长应该就可以了。
火龙岛主 2009-07-14
  • 打赏
  • 举报
回复
没有理由啊!
procedure TFrmOutShuaKa.BtnCarNoClick(Sender: TObject);
Var
len : Word;
Msg : String;
buf : array of char;

iPos,iCount,iLength:integer;
OStatus,OCarNo,OFileName:string;
Temp:array [0..1024] of string;
TempStr:string;
begin
inherited;//之前代码怎么写的?
ClientSocketOutCar.Close;
Try
ClientSocketOutCar.Active := true;
MessageBox(0,'连接成功!','',MB_OK + MB_ICONWARNING); //问题就在这里,我把这句加上就可以正常通讯,去掉就不能通讯
Except
MessageBox(0,'连接失败,请查看服务端是否有启动!','',MB_OK + MB_ICONWARNING);
end;

Msg := 'GET_LPN|'+BalanceNo+'|'+RightStr(inttostr(GetTickCount()),6)+'.'+#10#13;
Len := Length(Msg);
ClientSocketOutCar.Socket.SendBuf(msg[1],Len);
end;
surdon 2009-07-13
  • 打赏
  • 举报
回复
那还不容易 再
加下面 加一句 if not ClientSocket.Active then ClientSocket.Active:=true;
mjtalhx 2009-07-11
  • 打赏
  • 举报
回复
楼上的真是高见,我也发现了这个问题,把连接和发送命令写在一个按钮时间里有问题,但是分开写就正常了!但是我有个问题还是不是很明白!为什么我加了延时也不行(sleep(500);application.ProcessMessages;等)?是时间设的不够长还是因为别的?
hongqi162 2009-07-09
  • 打赏
  • 举报
回复
ClientSocket.Active:= true;
while ClientSocket.Connected do //判断是否连接上了,你也可以自定义一个timeout值作为判断条件
.....
mjtalhx 2009-07-09
  • 打赏
  • 举报
回复
发现一个新问题,在第一次执行ClientSocketOutCar.Active := true;
后ClientSocketOutCar.Active的值却仍然为False?
第二次执行的时候才为True?这是为什么呢?
jadeluo 2009-07-09
  • 打赏
  • 举报
回复
clientsocket.open是个非阻塞函数, 调用之后(连接还未成功)立即返回并继续执行后续的指令。

多写一句提示连接成功的对话框语句,这就给出了足够的时间去完成连接,之后就可以正常通讯。

把那句提示框的语句注释掉,就无法通讯,因为连接还未成功。
ajiwuweibin 2009-07-09
  • 打赏
  • 举报
回复
一定是你代码有问题,全部贴上来看看。
haitao 2009-07-08
  • 打赏
  • 举报
回复
延时的问题

不过,按理说actvie:=true应该是连接成功才走到下一步的
SuperTitan001 2009-07-08
  • 打赏
  • 举报
回复
设断点也导致了延时,MessageBox也是导致延时
SuperTitan001 2009-07-08
  • 打赏
  • 举报
回复
sleep(100)时间太短,你先尽量把时间设长一点,看是不是延时的问题,我估计肯定是延时的原因
mjtalhx 2009-07-08
  • 打赏
  • 举报
回复
我设了断点进行调试,
ClientSocketOutCar.Active := true;
这句执行时成功的!但是把注视那句去掉就是部能通讯,我快要崩溃了!难道这是ClientSocket的BUG?
yjytiantang 2009-07-08
  • 打赏
  • 举报
回复
一般来说 你加的只是个提示 对程式代码应该是没什么影响的啊。。。
你设个断点,单调一下 看注释掉以后走到那步是什么情况。
mjtalhx 2009-07-08
  • 打赏
  • 举报
回复
我加了sleep(100)或者加了application.ProcessMessages都行不通,不知道问题再哪里?搞的人都快要崩溃了!你说每次通讯的时候提示这么一个对话框给用户,那用户多烦啊。但是就是想不出好办法来解决!
SuperTitan001 2009-07-08
  • 打赏
  • 举报
回复
改成延时试试
mjtalhx 2009-07-08
  • 打赏
  • 举报
回复
字体加了颜色怎么没有反映啊!晕啊!

//问题就在这里,我把这句加上就可以正常通讯,去掉就不能通讯

mjtalhx 2009-07-08
  • 打赏
  • 举报
回复
procedure TFrmOutShuaKa.BtnCarNoClick(Sender: TObject);
Var
len : Word;
Msg : String;
buf : array of char;

iPos,iCount,iLength:integer;
OStatus,OCarNo,OFileName:string;
Temp:array [0..1024] of string;
TempStr:string;
begin
inherited;
ClientSocketOutCar.Close;
Try
ClientSocketOutCar.Active := true;
MessageBox(0,'连接成功!','',MB_OK + MB_ICONWARNING); //问题就在这里,我把这句加上就可以正常通讯,去掉就不能通讯
Except
MessageBox(0,'连接失败,请查看服务端是否有启动!','',MB_OK + MB_ICONWARNING);
end;

Msg := 'GET_LPN|'+BalanceNo+'|'+RightStr(inttostr(GetTickCount()),6)+'.'+#10#13;
Len := Length(Msg);
ClientSocketOutCar.Socket.SendBuf(msg[1],Len);
end;


问题见红色的字注明。大家有空帮忙看看

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧