从服务端------>N个客户端群发信息(100分)

  • 主题发起人 主题发起人 binhaiying
  • 开始时间 开始时间
B

binhaiying

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端------>N个客户端
要求:就是把相同的文本信息发给在同一个局域网的其它客户端,而且需要实时监测到各客户端的网络是否联通,使用哪个DELPHI网络控件比较好用?实现起来比较方便。
现在只实现了服务端向单个客户端发送,不能群发,因为有些信息是相同的需要用到群发,请各位不吝赐教。
 
自己顶一下,在线急求答案!!
 
遍历局域网IP。。。循环一个个发。。indy控件比较理想
 
如果你对indy在网络断线情况下的判断有把握请用TIDTCPSERVER/TIDTCPCLIENT这东西是线程式的,locklist保存着所有客户端线程指针,你遍历它就可以群发了.但我从来也没有解决网络断线告诉的超时错误的提示,以至于后来我winsock api在非阻塞模式下做了.
 
不过应该有很简单的解决办法,windows本身就有信使服务,就是你说的那种东西,好象只是一个命令,如果这样你可以winexec()来执行就可以了.具体命令你查找一下看看.
 
我的客户端程序在收到信息后先要存到本地数据库的。所以WINDOWS的信使服务应该是不能满足要求的,到底是循环一个个发还是用多线程同时发,我还不能确定哪个更好。循环一个个发做起来会比较简单一点,用多线程发的话我还不是很明白,希望能有具体的代码。
 
客户端自己维护状态
要求服务器发送数据
 
其实都是循环发,只是用INDY的时候,其服务端组件内建服务线程,你只需要遍历它就可以了.
如果用WINSOCK API也是要自己维护服务端的SOCKET,将其存在TLIST中,也只是遍历就可以了.不过用INDY我一直很不顺手,如果你能找到比较好的办法能解决由于非人为因素(如网断,客户机当机,断电等等,这些都是无法避免一定会发生的事情)网络中断时服务端相应服务线程仍处于BLOCKING状态,直到其发生线程超时为止,这样服务器会有错误提示,并且此服务线程就处于SUSPEND悬浮状态,你甚至无法通过正常方式关闭服务程序,通常只能是"任务管理器"中中止进程,并且要中止至少3次方可以中止掉,正因为如此所以我放弃了INDY,如果有人知道如果防止这种情况,也希望大家能告知我一下.
 
局域网可以使用udp广播
 
你做的indy,try except 没做好,
灰鸽子用的就是indy,每监听数据,就使用一次 try,就不会挂起了.

回答楼主的,经过分析灰鸽子的原理,使用indy9.018,使用动态数组存放客户机连接信息;
当indy server 收到:disconnect 事件,则遍厉数组,清空掉相应线程ID的数据信息,
发送消息时,可遍厉数组,发送文件流或文本信息流.局域网内,测试无问题(400+机器)

但INDY 在internet中,不一定会收到disconnect事件,所以,需要使用线程tag,做为标志,当处于等待信息时,可遍厉,以查看,是否中断.
 
UDP 最快但不保证一定收到。 当然 UDP 广播最快
 
TCP也没人敢保证都能收到
现在做网络传输都需要自己保证数据完整性
所以说需要在TCP/udp上面作进一步的处理
 
局域网用udp广播是最快的,通讯质量应该可以保证
 
后退
顶部