经过一番搜索,我认为Indy TCP服务器是我正在开发的即时通讯服务器上使用的最佳选择。目前唯一遇到的问题就是如何将消息广播和转发到其他连接的客户端。发送响应给同一客户端似乎很好并且不会影响其他客户端的活动,但是通过使用
aContext.locklist
并在连接列表之间迭代以找到接收数据的客户端连接的机制来转发消息到其他客户端。
我认为这里的问题是它会冻结列表并阻止处理其他客户端请求,直到调用 unlocklist。那么这是否会损害服务器的性能?在转发每条消息时 (因为这经常发生在即时通讯中),锁定列表并在连接之间进行迭代。是否有更好的方法来解决这个问题呢?
我正在使用 Indy 10 和 Delphi 7。
广播的代码:
Var tmpList: TList;
i: Integer;
Begin
tmpList := IdServer.Contexts.LockList;
For i := 0 to tmpList.Count Do Begin
TIdContext(tmpList[i]).Connection.Socket.WriteLn('Broadcast message');
End;
IdServer.Contexts.UnlockList;
转发消息的代码:
Var tmpList: TList;
i: Integer;
Begin
tmpList := IdServer.Contexts.LockList;
For i := 0 to tmpList.Count Do Begin
If TIdContext(tmpList[i]).Connection.Socket.Tag = idReceiver Then
TIdContext(tmpList[i]).Connection.Socket.WriteLn('Message');
End;
IdServer.Contexts.UnlockList;