-
Уважаемые, подскажите, как осуществляется отправка инфы конкретному клиенту по сокетам? Можно ли отправить напрямую без перебора всех активных. Как определить нужного клиента в этом случае? существует ли какой-нибудь идентификатор при подключении клиента к серверу?
-
> Уважаемые, подскажите, как осуществляется отправка инфы > конкретному клиенту по сокетам? Можно ли отправить напрямую > без перебора всех активных.
Конкретный клиент это который? В любом сучае у тебя будет список и поиск конкретного надо будет в нем выполнять.
> существует ли какой-нибудь идентификатор при подключении > клиента к серверу?
Этот индентификатор и есть сокет.
> Как определить нужного клиента в этом случае?
Нужного кому? И для чего?
-
> Андрей (07.06.08 11:52) [0]
1. Сперва скажи, какие сетевые компоненты и с какими настройками используешь 2. Можно. 3. см.1 4. Да.
-
> DVM © </I > kami ©
> Использую стандартный набор ServerSocket/ClientSocket Принцип такой же, как в обычном чате. Один из пользователей отправляет сообщение (данные) другому через сервер. Как серверу определить, что инфу надо послать не всем сразу, а конкретному пользователю без перебора всего списка подключенных к нему?
-
Не разобрался еще, как тут вставляются цитаты, поэтому такое сообщение получилось :)
-
> Один из пользователей отправляет сообщение (данные) другому > через сервер
Следовательно, в заголовке сообщения (данных) присутствует идентификатор того, кому эти данные адресованы. Пусть это будет (к примеру) IP (строкой или 4 байтами). Не претендуя на оригинальность/правильность решения, я бы сделал так: TMyClass=class(Txxxxx)
private
FClientList:TStringList;
FServerSocket:TServerSocket;
procedure TMyClass.OnClientConnect(..);
begin
FClientList.AddObject(Socket.RemoteAddress, Socket);
end;
procedure OnClientDisconnect(..);
begin
i:=FClientList.IndexOf(Socket.RemoteAddress);
if i<>-1 then
FClientList.Delete(i);
end; Теперь при необходимости отправить данные кому-нибудь нужный сокет находится просто: procedure SendData(ClientIP:String; Data:TStream (string, PChar etc...);
var
Socket:TCustomWinSocket;
i:integer;
begin
i:=FClientList.IndexOf(ClientIP);
if i<>-1 then
begin
Socket:=TCustomWinSocket(FClientList.Objects[i]);
Socket.SendXXXXX(Data);
end;
end; Конечно же, в примере не учитывается обработка ошибок и склейка/разбиение пакетов.
-
> kami © (11.06.08 15:48) [5]
Во-первых, уникальность партнера определяется не IP-адресом, а комбинацией IP-адрес:порт.
Во-вторых, городить огород со списком FClientList нет никакого резона - интересующая инф-ция о клиентах (RemoteAddress в частности ) доступна в списке Connections.
-
> комбинацией IP-адрес:порт
Согласен целиком и полностью. Но вряд ли на одном компьютере будет устанавливаться 2 клиента чата.
> интересующая инф-ция о клиентах (RemoteAddress в частности > ) доступна в списке Connections
Да, но в этом случае поиск нужного клиента будет проводиться явно, а не скрываться в методах TStringList.
-
> kami (12.06.2008 0:56:07) [7]
До поры до времени, пока кто-то не окажется за НАТ
-
> До поры до времени, пока кто-то не окажется за НАТ
Сделайте одолжение - расшифруйте эту фразу :)
-
> kami ©
Спасибо за пример, попробую.
-
> Андрей (13.06.08 13:36) [9] > > > До поры до времени, пока кто-то не окажется за НАТ > > Сделайте одолжение - расшифруйте эту фразу :)
А что тут расшифровывать? Клиенты, сидящие за NAT, имеют один и тот же адрес IP. отличаются только портом, который NAT выдаёт.
-
> До поры до времени, пока кто-то не окажется за НАТ
Или за прокси-сервером.
> вряд ли на одном компьютере будет устанавливаться 2 клиента > чата.
А никто и не говорил об этом.
Два клиента на разных хостах для доступа к серверу пользуются одним и тем же NAТ- или proxy-сервисом - сервер будет их "видеть" под одним и тем же IP-адресом, но под разными портами.
-
> Сергей М. © (15.06.08 15:39) [12] > А никто и не говорил об этом
А я и не говорил, что нужно обязательно использовать IP в качестве идентификатора : > kami © (11.06.08 15:48) [5] > Пусть это будет (к примеру) IP (строкой или 4 байтами).
Все будет определяться задачей. Это может быть и (опять же к примеру) логин пользователя. Но, тем не менее - уели :)
|