最近碰到一个怪现象:
我用ClientSocket做的东东去联接ServerSocket,当我进行ClientSocket.Active:=true时ServerSocket的OnAccept事件中有响应,而当我用ClientSocket的SendBuffer去发送信息时出现怪事:如果ClientSocket.Active:=true这句话同ClientSocket.SendBuffer放在一起按顺序一次性执行则服务端没有响应如果将这两句话分别放在两个按钮事件中,先点击一个按钮,再点击另外一个按钮则服务端就有响应,而将两个按钮事件通过一个过程一次性按顺序执行(只通过一次点击)又不行了,真是搞不懂是什么原因有哪位大侠帮帮解决此问题呀,不胜感谢!

解决方案 »

  1.   

    异步Socket.
    ClientSocket.Active:=true;时后,只是通知系统,打开这个Socket,但是还没有真正连接上,只有OnConnect事件产生后,才真正的连接上了,这时候就可以SendBuffer了。放在2个按扭中,是因为有操作的时间延时,中间系统能够处理消息,把Socket打开,并且连接上,自然可以SendBuffer了。你要在OnConnect事件产生后才能发送接收数据。
      

  2.   

    ClientSocket感觉很差啊,最近也是在研究这方面的问题.
    越用越不爽.后来换成idTCPCLient了.
    ClientSocket,Borland都说要放弃了.建议还是换掉吧.
      

  3.   

    断点不一定能调试出这个问题.对于TClientSocket默认情况下是异步select,当调用connect之后并不会立即完成连接的动作(如果快的话有可能会完成,但是并不保证),但是异步操作是会立即返回的.这个时候要么等OnConnect事件触发(这种做法并不完全准确,比如说连接不上的情况下,那么程序就会犯傻了,特别是某些人喜欢把OnError当中直接给一个ErrorNo:=0的做法^_^),要么就是通过一个循环,不断的检查TClientSocket的连接状态.发现不是connecting,那么就中断循环,然后进行进一步判断是连接上还是连接失败(连接上为Connected).当连接判断到连接成功之后就可以立即发送数据了.完成端口对客户端意义不大,不要动不动就是完成端口,完成端口还有很多它的适用性情况,以及一些复杂问题需要处理.ClientSocket并不差,或者没有太多可以说它差的理由,仅仅只是使用习惯问题.习惯了的人会觉得很好用.但是不管使用什么控件也好还是使用API封装也罢,首先第一个需要理清楚的概念就是同步和异步.
      

  4.   

    哎,还没用精这两个东西哟。
    发送数据应该在OnWrite事件激发之后再进行,否则,会出现无法预测的结果(有时准备好了,就成功了,有时未成功,就失败)。另外必须注意:ClientSocket发几个Send,Serversocket并不一定出现几个OnRead事件,因为底层的发送要根据数据量、缓冲区大小等因素决定是否把数据送出。所以,对于TServersocket端,要处理好数据接收是否完整及粘包问题。