TClientSocket使用Open()连不上服务器的问题,在线等待高手解决!

weep_boy 2004-12-03 02:39:10
我需要用ClientSocket与服务器连接进行通讯.代码大概是这样的:
TClientSocket * ctskt=NULL;
ctskt = new TClientSocket(NULL);
ctskt->Active = false;
ctskt->Address = 省略;
ctskt->Port = 省略;

下面在一个方法里有这样的代码:
AnsiString messageinfo = "Hello!";

ctskt->Open();
ctskt->Socket->SendText(messageinfo);
每次调用这个方法的时候第一次服务器都没有收到消息,但第二次调用就有了,我加了调试代码在Open()和SendText()后,发现第一次调用该方法后该Socket一直是false的,但为什么第二次调用发数据就能收到呢?我用的是CB6,在CB版块没有高手参与,请这边的大虾帮忙解决,在线等待!而且这里面Catch不到任何异常,使用ctskt->Active = True;代替Open(),结果一样不行!.....急急急!
...全文
288 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
weep_boy 2004-12-08
  • 打赏
  • 举报
回复
我用另外的方法解决了该问题,不过对该问题出现的原因不太理解,主要是对消息机制和线程不太了解。希望wangjintu能帮忙介绍资料,谢谢!谢谢大家,这里结贴!
wangjintu 2004-12-06
  • 打赏
  • 举报
回复
onConnect是靠消息来触发的,你把这个控件放在线程中调用,就相当于采用了blocking 模式,这时候怎么能够触发呢。
wangmimi 2004-12-06
  • 打赏
  • 举报
回复
同意a12345的处理方式,
cltsck.open();
Application.ProcessMessages;

cltsck.sendtext('The string ......');
weep_boy 2004-12-06
  • 打赏
  • 举报
回复
syl79(),你的方法我也试了,很奇怪,我打印出来了所有 TClientSocket的事件,发现,Open只触发了onconnecting时间,然后就没有了,感觉是连接不成功,因为成功的话应该会有onconnect事件的.难道多线程回调函数里面使用TClientSocket的Open是有问题的吗?,因为我把Open随便放到别的地方,onconnect事件都会触发即连接能成功.很郁闷啊.不知道这里有没有高手尝试一下,看是否会出我这样的问题呢?
weep_boy 2004-12-05
  • 打赏
  • 举报
回复
yw1621你的方法我已经试过了,一直处于等待中,因为不知道什么原因,永远都连不上去了,很奇怪
syl79 2004-12-05
  • 打赏
  • 举报
回复
我同意bee2518的看法,把ctskt->Socket->SendText(messageinfo); 放到onconnect中去。
syl79 2004-12-05
  • 打赏
  • 举报
回复
yw1621的语句问题在于只有onconnect发生了,cltsck.active才为true,如果在程序中使用while则当前过程无法所回,也就不可能有onconnect。有点像几何中的循环论证,呵呵。
yw1621 2004-12-04
  • 打赏
  • 举报
回复
不好找原因的话就这样吧
cltsck.open();
while True do
begin
sleep(10);
if cltsck.Active=True then
cltsck.sendtext('The string ......');
end;
a12345 2004-12-04
  • 打赏
  • 举报
回复
使用Open()后,再处理一下消息就可以了,

Application.ProcessMessages;
sleep(200);
weep_boy 2004-12-03
  • 打赏
  • 举报
回复
bomdy():
我现在的问题是,我调用了Open()后,一直无法真正建立连接,即ClientSocket的onconnect事件一直无法触发.和平时唯一不太一样的地方是,我调用Open()的函数,是一个被多线程函数调用的回调函数.难道是这个原因,导致onconnect事件不能触发吗?因为我在别的地方(比如一个按狃)调用Open(),都可以触发onconnect事件的........有什么办法解决吗?
bomdy 2004-12-03
  • 打赏
  • 举报
回复
如同 wangjintu(wangjin) 所说,在异步模式下调open后socket只是启动了tcp连接的握手过程,连接还没有真正建立,需要等到OnConnect事件之后连接才真正建立,这时才可以收发数据

如果你非要connect后马上发数据的话,那就采用同步模式
weep_boy 2004-12-03
  • 打赏
  • 举报
回复
没有connect方法的,请问有没有大虾知道这个问题的.帮帮我啊?先谢了!
nyf1220 2004-12-03
  • 打赏
  • 举报
回复
别opn了,那你直接调用connect不行吗?
weep_boy 2004-12-03
  • 打赏
  • 举报
回复
谢谢楼上,我DEBUG后发现程序明明经过了ctskt->Open();这一部,但就是不触发onconnect事件,但实际上好象已经连上了,因为我推出程序的化,会报告socket error 10053正常情况下只有在连接建立但突然中断才会出这样的错误,但就是不触发onconnect事件,我没有办法把数据发出去.郁闷啊!
,如果我把该Open(),放到别的地方,就会触发事件.
另外,我的那个Open()方法调用的地方是一个回调函数,即有可能被多线程调用,这个没影响吧,线程安全我已经考虑到了,请大虾们再帮帮忙.单位要程序很急啊,谢谢大家了.
wangjintu 2004-12-03
  • 打赏
  • 举报
回复
因为你采用的可能是ct nonblocking 模式,这是异步模式,程序每次只关心执行,而不关心结果,你open语句执行后,连接并没有建立,clientsocket不关心这个,等结果返回,直接执行下一句,即sendtext,连接建立的速度肯定没有cpu处理语句速度快,所以第一次发送数据就会失败
aiirii 2004-12-03
  • 打赏
  • 举报
回复
一時看不出代碼明顯的錯誤, 但

ctskt->Open();

在這裹檢查, 等待聯接成功再發送也對
ctskt->Socket->SendText(messageinfo);
nyf1220 2004-12-03
  • 打赏
  • 举报
回复
这两句连在一起使用时,是肯定不会发送的

楼上的,为什么啊,讲讲可以吗?
bee2518 2004-12-03
  • 打赏
  • 举报
回复
ctskt->Open();
ctskt->Socket->SendText(messageinfo);
这两句连在一起使用时,是肯定不会发送的,如果你想连接成功就发送,把它放到Connect事件里面发送

1,593

社区成员

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

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