原来用D6写的socket程序,想转换成d7的indy来实现,可是看了几个实例,还是有一些问题搞不清楚,主要是关于客户端的问题一:
  d6中,不管是clientsocke还是serversocket,都有一个data属性,可以保存一个自定义的数据结构,用于记录双方的当前状态。
  在INDY中,TIdTCPServer.connection中也有一个data属性,虽然是TObject对象,似乎也可以实现类似的功能,但是TIdTCPClient中却没有发现,不知道有没有类似的属性可以实现这个功能?当然没有也没关系,可以用别的办法来实现问题二:
  d6中的clientsocke,有一个onread事件,可以监听服务端的数据传输;INDY中的TIdTCPClient中没有发现这个事件,也没有onExecute,不知道该怎样监听来自服务端的数据传输事件?是否需要用Timer来随时read服务端是否有信息传来?问题三:
  看了几个INDY的实例,无论是String,还是Stream,都是write一次性发送过去,不知道INDY的内部处理是怎样的,如果需要发送一个几十上百M的文件时,这样一次性的write恐怕不合适吧?
  如果要把文件分段传输,就要再回到问题二了,当客户端的一个请求需要与服务端多次通讯才能完成时,客户端该用什么办法来高效的响应与服务端的通讯?请高手帮忙解答一下这些问题,另外本人正在做的是实现一个数据同步服务,把多个不同业务系统中需要同步的数据集中,以供其它需要这些数据的客户端下载使用,总感觉设计方面很乱,想不到什么好的办法,欢迎有这方面兴趣的朋友一起交流。

解决方案 »

  1.   

    问题一:应该有的,楼主再试试吧.
    问题二:既然是TCP,如果客户端要得到服务端的主动通知,那就不要断开连接,也就是保持长连接,一旦断开连接,服务端就不可能主动去连客户端了.如果你只想搞短连接,就在客户端也搞一个TCPServer监听,在服务端搞个TCPClient去连接。或者用UDP,就不存在客户端和服务端的问题了.问题三:我有试过在局域网内发600M以上的文件,INDY控件在内部就已经处理这些东西,楼主不用太担心这个,如果要自己处理的话那不如自己用API封装了,当然在广域网上通讯的稳定性我没这样试过.楼主反复提到问题二,估计楼主对TCP协议还不太了解. TCP连接打通的时候,服务端是可以随便往客户端发东西的。INDY控件,TIdTCPServer和TIdTCPClient,只要连通了,两边不管谁调了write,另一边都可以用read读出来.断开了就只能由客户端去连接服务端.