导航
  • 主页
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

老掉牙的Delphi编写Socket通讯程序问题,请高手帮帮忙!

chenjbjbjb 2001-10-12 05:06:06
在我的程序中用到了ClientSocket控件,我发现第一次ClientSocket连接服务器的时间较长
如果我把ClientSocket.ClientType设置成非阻塞模式(ctNonBlocking)发现下面的语句会出
问题
...
...
...
ClientSocket.Active := true;
ClientSocket.Socket.SendText('Hello');
SendText根本不会执行,在非阻塞模式下当SendText执行时,ClientSocket就根本还没有连接上。
然后我将ClientSocket.ClientType设为阻塞模时(ctBlocking)上面的语句执行成功了,
但新问题又来了,clientsocket的OnRead事件怎么也不相应。我从服务器发数据给客户端,OnRead
的事件根本不会被触发,大家知道这是怎么回事吗?
还请高手指点指点,先谢过了!
...全文
74 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjbjbjb 2001-10-13
我会给你们加分的,不过我想先等等,看看被人有什么想法
thanks
回复
chenjbjbjb 2001-10-13
to diecode(老死鸡) 
"在OnConnect时间中调用SendText"
这个我想到过了, 主要是我本想在一个线程里完成connect-send-receive,然后结束线程。
后来我使用了下面的办法
在线程的execute里
try
ClientSocket.Active := true;
except on ESocketError do
MessageDlg('Unable to Connect to Server ' + #13 + 'Please Try Again!',mtInformation,[mbOk],0);
end;
Self.FWaiting := true;
while Self.FWaiting do
begin
Application.ProcessMessages;
end;
ClientSocket.Send(data);
end;
我在onConnect里将FWaiting设成false;
在execute里用
Application.ProcessMessages;
等待。等连接上了以后我再send。
receive也用了同样的道理。
但不好的地方就是如果服务器出了问题,线程就不会退出,一直在那边等。除非自己再加一些控制的代码,好麻烦。我只是想再一个线程里处理所有操作,然后关掉Socket,结束线程。不知有没有好的办法呢?
to Wango(我为程狂) 
好像没明白我的意思,不过谢了:)
回复
Wango 2001-10-12
记不清是Connections[0]还是Connection[0]了.
回复
Wango 2001-10-12
ServerSocket1.Socket.Connections[0].SendText('Hello')
*************
回复
diecode 2001-10-12
1 设置成非阻塞模式(ctNonBlocking)
2 在OnConnect时间中调用SendText
回复
发动态
发帖子
Delphi
创建于2007-08-02

4809

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告