开发环境为WinXP+Delphi7,控件默认。现客户端与服务器都使用IdTCPClient+IdTCPServer通信。
客户端20个,服务器2个[192.168.0.1][192.168.0.2],客户端全部一直运行,服务器大部分时间只有一个在运行。
客户端不定时向服务器发送'文件名+图片数据流'的数据。服务器接收到数据后,将图片显示在程序界面上,大约5~30秒后,返回一个'id'给客户端[在这段时间,客户端也会向服务器发送数据],清空服务器程序界面,如果有数据,继续处理。
客户端接收到'id',自行处理。全流程结束。
这样的情况,客户端与服务器怎么处理比较合适呢?以前是用UDP做的,客户端同时向2个服务器发送数据[不考虑2个服务器的死活-.-]。服务器端接收到数据后,把数据放入一个列表内,再运行一个timer,不断从列表内取出数据来处理。
虽然是内网,但是数据包有点大?所以丢包也不少,要自己处理数据包重发。在udpserver接收处检测收到的数据是否重复,但还是可能会把重复的数据放入列表。现在数据包又大了很多,UDP处理大概比较困难了吧...
客户端20个,服务器2个[192.168.0.1][192.168.0.2],客户端全部一直运行,服务器大部分时间只有一个在运行。
客户端不定时向服务器发送'文件名+图片数据流'的数据。服务器接收到数据后,将图片显示在程序界面上,大约5~30秒后,返回一个'id'给客户端[在这段时间,客户端也会向服务器发送数据],清空服务器程序界面,如果有数据,继续处理。
客户端接收到'id',自行处理。全流程结束。
这样的情况,客户端与服务器怎么处理比较合适呢?以前是用UDP做的,客户端同时向2个服务器发送数据[不考虑2个服务器的死活-.-]。服务器端接收到数据后,把数据放入一个列表内,再运行一个timer,不断从列表内取出数据来处理。
虽然是内网,但是数据包有点大?所以丢包也不少,要自己处理数据包重发。在udpserver接收处检测收到的数据是否重复,但还是可能会把重复的数据放入列表。现在数据包又大了很多,UDP处理大概比较困难了吧...
解决方案 »
- delphi2006下OCX控件的安装方法
- i can't say anything!
- 在IntraWeb技术中I我创建了3个网页,第一个为form1,第二个为form2,第三个为form3,在运行时程序默认为第一个,我想让第二个网也成为首先
- fastreport??????
- 在记录类型文件中怎么能写入超过255个字节的字符串呢?还是有其他方法能起到同样的作用?
- 快来看:怪现象!!
- 一个不可失意的兼容问题(在线等侯)
- 如何运用locate来定位在adoquery中的记录
- 如何用delphi做程序的帮助文件
- AddressOf 在DELPHI里怎么做
- 怎样在报表里面循环打印呢?
- 怎样在关闭窗体时清除与某个数据库有关的所有数据库对象?
正常情况每秒的通讯流量约为378083*(1~5),每秒最高的通讯流量大约在378083*20,理论最高的通讯流量大概在378083*150IdTCPClient+IdTCPServer制作的客户端和服务器端单个数据包的发送/处理已经做好了,就是Server收到后显示到程序界面,处理完成后给Client返回ID,清空Server界面,等下一个数据的到来。
但是Server端同时收到多个数据包的时候,不知道有什么好的处理方法。还是只有继续使用放进列表,timer循环取出处理?
IdTCPServer是工作在多线程阻塞方式下的, 也就是每个Client连接对应有一个Server线程, 该线程内使用阻塞函数来读取、处理数据。
当Server端同时收到多个Client发送来的数据包时,就会出现多个Server线程都需要操作程序界面来显示数据的情况了。
此时,可以采用线程同步的方法,这其实是让多个Server线程序列化,在前面的线程完成显示数据之前会导致后面的线程代码暂时阻塞,这样一来,数据包的处理就需要等到当前线程数据显示完成之后才可以进行,这可能会影响一些效率。
也可以Server线程接收到数据包后放入一个队列,再另外设计一个线程来负责从这个队列中读取数据包并显示,这样数据包的处理就不需要等到数据完成显示之后了,换来的代价是要准备一个足够大的队列空间。