TServerSocket如何转发用户信息(42分)

  • 主题发起人 月满C楼
  • 开始时间

月满C楼

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端发消息到服务器端,通过服务器的ServerSocket如何将该消息转发到另外一个客户端?
目前使用的办法是在服务器端维护一组TCustomWinSocket//TInfoClientList
type
TInfoClient=record
Handle: integer;
//客户端套接字句柄
Socket:TCustomWinSocket;
//客户端套接字
Name:string;
//客户端计算机名称
Address:string;
//客户端计算机IP地址
Used: boolean;
//客户端联机标志
UserNO:string;
end;
type TInfoClientList=array of TInfoClient;
数组来实现,由于考虑到一台主机又多个用户客户端的盒子情况,所以添加了唯一标识UserNO来实现
但通过这种方法来实现的时候总需要使用循环TInfoClientList数组来实现信息的转发
当然目前我开发的系统同时用户数最多就200,这个效率应该是没问题。
但如果用户数多起来甚至达到2000的话,我估计这样循环转发消息将会带来服务器出来不过来问题
 

月满C楼

Unregistered / Unconfirmed
GUEST, unregistred user!
再配合使用使用多线程 + TMultiReadExclusiveWriteSynchronizer就可以极大的提交效率了,不过能同时实现5千万可能可能延时将会超过3秒,不过这么多数目的TCustomWinSocket可能内存消耗就好恐怖了
 
H

hhjjhhjj

Unregistered / Unconfirmed
GUEST, unregistred user!
Handle: integer;
//客户端套接字句柄 -- 用这个来作为唯一标识是最好的。
一个1-2000和1-2000的for循环在效率上应该不会有好大的差别。
1:每个客户端上线时下载在线的客户端信息(包括Handle),并广播自己的上线信息(包括Handle),让已经在线的客户端得到自己的信息。
2:发送消息时,消息中包括消息内容和接收方的Handle,可以包含更多的信息。
3:server收到消息后,分析出接收方Handle,重新构造消息,加入发送方的Handle,然后就遍历连接,找到接收方,发送消息。
4:接收方收到消息后,分析发送方Handle,在回到第2个步骤,就可以回复消息了。
服务端遍历如下:
With ServerSocket1.Socketdo
For i := 0 To ActiveConnections - 1do
//遍历连接的客户端Handle
begin
If Connections.Handle = aHandle then
//找到对应的客户端Handle
begin
Connections.SendText('ddd');
//发送消息
Break;
end;
end;
 
顶部