我目前有一个项目,是使用TCP/IP协议的。另一个外国公司提供了TCP/IP的协议,协议里定义了好几种数据包格式,各种包长度不同。我需要建立一个socket客户端,然后向他的服务端发送数据包,然后读取他返回的数据包。因为我只能采用非阻塞方式,当我发送完包后,如何读取他返回的数据流?因为他的包并不是一次性到达,因此我必须多次读取然后组装,这个比较郁闷,我是一头雾水,有做过的请指点下谢谢!~其实我就是使用客户端组件就可以了,indy的IdTCPClient是阻塞的,delphi以前的SocketClient,和现在Delphi7的TcpClient,这几种组件,我改如何选择,如何使用啊看到一写资料,说发包后创建线程,一边接收一边解析,是什么意思?

解决方案 »

  1.   

    TCP/IP 數據包封裝,重組一般都由操作系統完成.
    你只需要使用socket發送與接收就好了.
    樓主需要加強TCP/IP的知識.可以看看相關RFC文檔.是否客戶的數據格式是架構於TCP/IP之上,用TCP/IP重新封裝.類Oracle8的net8協議,http,smtp之類.
      

  2.   

    用IdTCPClient加阻断器(Indy intercepts)配合使用呢
      

  3.   

    楼主是做长连接方式的交易吧,其实用阻塞与非阻塞方式SOCKET都可以,如使用前者是另建立独立的接收线程,后者则处理事件响应...
    楼主可以参考一些源码,比如TSocketConnection的实现源码.明白楼主面对的难点,其实这样类似的遇到稍复杂的数据问题,都有一个原则性的思路:使用队列
    这用队列是广义的,也许可以是数据库的一张表,也许是内存中一个链表,也许是利用WINDOWS消息队列.....