开发环境为WinXP+Delphi7,控件默认。现客户端与服务器都使用IdTCPClient+IdTCPServer通信。
客户端20个,服务器2个[192.168.0.1][192.168.0.2],客户端全部一直运行,服务器大部分时间只有一个在运行。
客户端不定时向服务器发送'文件名+图片数据流'的数据。服务器接收到数据后,将图片显示在程序界面上,大约5~30秒后,返回一个'id'给客户端[在这段时间,客户端也会向服务器发送数据],清空服务器程序界面,如果有数据,继续处理。
客户端接收到'id',自行处理。全流程结束。
这样的情况,客户端与服务器怎么处理比较合适呢?以前是用UDP做的,客户端同时向2个服务器发送数据[不考虑2个服务器的死活-.-]。服务器端接收到数据后,把数据放入一个列表内,再运行一个timer,不断从列表内取出数据来处理。
虽然是内网,但是数据包有点大?所以丢包也不少,要自己处理数据包重发。在udpserver接收处检测收到的数据是否重复,但还是可能会把重复的数据放入列表。现在数据包又大了很多,UDP处理大概比较困难了吧...

解决方案 »

  1.   

    现在客户端发送给服务器的数据MS.Size=378083
    正常情况每秒的通讯流量约为378083*(1~5),每秒最高的通讯流量大约在378083*20,理论最高的通讯流量大概在378083*150IdTCPClient+IdTCPServer制作的客户端和服务器端单个数据包的发送/处理已经做好了,就是Server收到后显示到程序界面,处理完成后给Client返回ID,清空Server界面,等下一个数据的到来。
    但是Server端同时收到多个数据包的时候,不知道有什么好的处理方法。还是只有继续使用放进列表,timer循环取出处理?
      

  2.   

    就是最普通的局域网...数据都是在内网发送和接收的数据大主要是因为客户端把图片SaveToStream(MS),发送给服务器端了
      

  3.   


    IdTCPServer是工作在多线程阻塞方式下的, 也就是每个Client连接对应有一个Server线程, 该线程内使用阻塞函数来读取、处理数据。
    当Server端同时收到多个Client发送来的数据包时,就会出现多个Server线程都需要操作程序界面来显示数据的情况了。
    此时,可以采用线程同步的方法,这其实是让多个Server线程序列化,在前面的线程完成显示数据之前会导致后面的线程代码暂时阻塞,这样一来,数据包的处理就需要等到当前线程数据显示完成之后才可以进行,这可能会影响一些效率。
    也可以Server线程接收到数据包后放入一个队列,再另外设计一个线程来负责从这个队列中读取数据包并显示,这样数据包的处理就不需要等到数据完成显示之后了,换来的代价是要准备一个足够大的队列空间。