1、客户与客户之间的通信。   成百上千的客户端,之间相互通信,如客户A跟客户B说了一句话或者传递一个文件,因为是广域网TCP协议的,所以,需要服务器中转一下。中转应该怎么做呢?
   (1)是否可以这样,所有客户端发到服务器的数据,全部放到一个临时列队中(比如TLIST),然后开多线程,分别读取列队的数据,然后找到相应的SOCKET连接,发送数据过去。这样做的好处,就是客户A把数据发给服务器就算完毕。无须等待客户B是否接收到,这部分由服务器完成。缺点是,服务器端开了额外的线程。如果可行的话,那么开多少个线程才合理。
   (2)也可以不放入列队中,直接遍历SOCKET列表,直接转发给客户端。这样的好处就是不用让服务器多开线程处理,缺点就是,如果客户A发送的是文件,客户B没接受完,客户A就得一直等待下去。如果客户B要是出现断网等异常,那么客户A会很“尴尬”。服务器的性能也下降。
   综合分析,我选择第一种。当然,我想不出其他的更好的点子。
2、服务器端推送数据给客户端。   也就是说,服务器主动发信息给客户端。正常来说,客户端连接到服务器后,按照预定好的协议,一问一答的进行通信。那么,有些场景需要服务器主动发送数据给客户端,是服务器先请求。这个情况下,是不是考虑客户端开2个连接,这样,客户端主动请求的数据动过连接1来完成,其过程就是一问一答。而服务器推送过来的数据,由另一个连接发送过来,客户端只收数据,分析数据包的内容,然后自己处理。   为什么问这个问题,因为如果客户端和服务器只有一个连接,客户端和服务器再进行一问一答的时候,突然,有别的数据从服务器过来(比如其他客户端通过服务器中转过来的数据,和服务器想主动推送的数据),那么客户端正常的一问一答的顺序就乱了。    所以我认为开2个连接比较合理,一个负责常规的一问一答,一个只负责接收服务器发过来的额外数据。3、服务器被迫将多个数据同时发给客户端。   有一个这样的情况,10个客户端同时跟客户端A说话,服务器通过某个连接,把数据转发给客户端,假如说,协议是分成几个部分的,一段一段的发向客户端,那么客户端就有可能出现数据包混乱的情况。简单的举个例子,数据包比如是先发长度,在发内容,那么理论上如果出现,N个客户端要跟客户端A说话的时候,因为是多线程同时给客户端发,如果并发了,那就出现数据长度和数据内容先后的顺序乱掉了,起码客户端那边有可能乱了。在形象点就是,客户端可能先收到了2个或者更多的长度,而没收到内容,不是想象中,一跳一挑完成的过来的。
   所以,是否要考虑,服务器在转发数据的时候,做一个灵活的处理,判断当前的连接是否被使用,如果使用中,就暂时等等,等连接空闲了,在使用。这样就防止了一个连接被多个线程调用,造成数据包乱序。
暂时问题就这么多。都是在实际操作中考虑的,因为没有经验,特来请教。主要是环境不好,不方面测试到这些问题。请大家帮帮忙……

解决方案 »

  1.   

    搬张板凳来了,good good study, day day up
      

  2.   

    DELPHI 版人比较冷清哦…… 在多等等吧!我喜欢DELPHI 希望版块强大起来!
      

  3.   

    理论上,tcp对于 一个客户端和一个服务器 之间的数据,能保证连续的
    但是,实际上,一次发送的数据包大了,网络差了(尤其是以前国内几个isp、高校之间),还是会有很多异常
    所以,自己把数据分小块加序号多次发,再加重发机制,才最稳妥