ClientSocket和ServerSocket的问题

bluebilly 2008-07-30 12:41:30
最近碰到一个怪现象:
我用ClientSocket做的东东去联接ServerSocket,当我进行ClientSocket.Active:=true时ServerSocket的OnAccept事件中有响应,而当我用ClientSocket的SendBuffer去发送信息时出现怪事:

如果ClientSocket.Active:=true这句话同ClientSocket.SendBuffer放在一起按顺序一次性执行则服务端没有响应

如果将这两句话分别放在两个按钮事件中,先点击一个按钮,再点击另外一个按钮则服务端就有响应,而将两个按钮事件通过一个过程一次性按顺序执行(只通过一次点击)又不行了,真是搞不懂是什么原因

有哪位大侠帮帮解决此问题呀,不胜感谢!
...全文
149 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wpy020327 2008-08-22
  • 打赏
  • 举报
回复
哎,还没用精这两个东西哟。
发送数据应该在OnWrite事件激发之后再进行,否则,会出现无法预测的结果(有时准备好了,就成功了,有时未成功,就失败)。

另外必须注意:ClientSocket发几个Send,Serversocket并不一定出现几个OnRead事件,因为底层的发送要根据数据量、缓冲区大小等因素决定是否把数据送出。所以,对于TServersocket端,要处理好数据接收是否完整及粘包问题。
xjjrocker 2008-07-30
  • 打赏
  • 举报
回复
没有理由。你自己断点调试看看。我这样都没问题。
或者你代码贴出。
gzmhero 2008-07-30
  • 打赏
  • 举报
回复
异步Socket.
ClientSocket.Active:=true;时后,只是通知系统,打开这个Socket,但是还没有真正连接上,只有OnConnect事件产生后,才真正的连接上了,这时候就可以SendBuffer了。

放在2个按扭中,是因为有操作的时间延时,中间系统能够处理消息,把Socket打开,并且连接上,自然可以SendBuffer了。

你要在OnConnect事件产生后才能发送接收数据。
qkhhxkj102 2008-07-30
  • 打赏
  • 举报
回复
楼上高人
leeky 2008-07-30
  • 打赏
  • 举报
回复
时间的问题。
很多的操作是需要一个等待(使连接真正完成)的。比如串口操作,不要在打开串口就立即发数据,至少要等个时间。你放在两个事件中恰好满足了这个等待。
项目中有很多这样的场合要注意。
僵哥 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xjjrocker 的回复:]
没有理由。你自己断点调试看看。我这样都没问题。
或者你代码贴出。
[/Quote]
断点不一定能调试出这个问题.

对于TClientSocket默认情况下是异步select,当调用connect之后并不会立即完成连接的动作(如果快的话有可能会完成,但是并不保证),但是异步操作是会立即返回的.这个时候要么等OnConnect事件触发(这种做法并不完全准确,比如说连接不上的情况下,那么程序就会犯傻了,特别是某些人喜欢把OnError当中直接给一个ErrorNo:=0的做法^_^),要么就是通过一个循环,不断的检查TClientSocket的连接状态.发现不是connecting,那么就中断循环,然后进行进一步判断是连接上还是连接失败(连接上为Connected).当连接判断到连接成功之后就可以立即发送数据了.

[Quote=引用 3 楼 Lljcs2007 的回复:]
用完成端口吧,本人现在也正用它来开发网络应用呢。感觉很好。。。
[/Quote]
完成端口对客户端意义不大,不要动不动就是完成端口,完成端口还有很多它的适用性情况,以及一些复杂问题需要处理.

[Quote=引用 5 楼 caize131 的回复:]
ClientSocket感觉很差啊,最近也是在研究这方面的问题.
越用越不爽.后来换成idTCPCLient了.
ClientSocket,Borland都说要放弃了.建议还是换掉吧.
[/Quote]
ClientSocket并不差,或者没有太多可以说它差的理由,仅仅只是使用习惯问题.习惯了的人会觉得很好用.但是不管使用什么控件也好还是使用API封装也罢,首先第一个需要理清楚的概念就是同步和异步.
caize131 2008-07-30
  • 打赏
  • 举报
回复
ClientSocket感觉很差啊,最近也是在研究这方面的问题.
越用越不爽.后来换成idTCPCLient了.
ClientSocket,Borland都说要放弃了.建议还是换掉吧.
Corn1 2008-07-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzmhero 的回复:]
异步Socket.
ClientSocket.Active:=true;时后,只是通知系统,打开这个Socket,但是还没有真正连接上,只有OnConnect事件产生后,才真正的连接上了,这时候就可以SendBuffer了。

放在2个按扭中,是因为有操作的时间延时,中间系统能够处理消息,把Socket打开,并且连接上,自然可以SendBuffer了。

你要在OnConnect事件产生后才能发送接收数据。
[/Quote]
Lljcs2007 2008-07-30
  • 打赏
  • 举报
回复
用完成端口吧,本人现在也正用它来开发网络应用呢。感觉很好。。。

1,593

社区成员

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

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