После долгих поисков я подумал, что лучше всего использовать Indy TCP server на сервере обмена мгновенными сообщениями, над которым я работаю. Единственная проблема, с которой я сейчас сталкиваюсь, - это широковещательная передача и пересылка сообщения другому подключенному клиенту, отправка ответа тому же клиенту выглядит нормально и не вешает активность других клиентов, но для пересылки сообщения другим клиентам - механизм, о котором я знаю заключается в использовании aContext.locklist
и перебора списка соединений для поиска клиентского соединения, которое должно получить данные.
Проблема здесь, я думаю, в том, что он замораживает список и не обрабатывает запросы других клиентов, пока не будет вызван список разблокировки. Так не повредит ли производительность сервера? блокировка списка и итерация между соединениями для пересылки каждого сообщения (как это часто бывает в мессенджерах). Есть ли лучший способ сделать это?
Я использую 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;