![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка информации по сокетам [D7]
Андрей © (2008-06-07 11:52:00)Уважаемые, подскажите, как осуществляется отправка инфы конкретному клиенту по сокетам? Можно ли отправить напрямую без перебора всех активных. Как определить нужного клиента в этом случае? существует ли какой-нибудь идентификатор при подключении клиента к серверу?
kami (2008-06-16 22:24:00) [1]> Сергей М. © (15.06.08 15:39) [12]
> А никто и не говорил об этом
А я и не говорил, что нужно обязательно использовать IP в качестве идентификатора :
> kami © (11.06.08 15:48) [5]
> Пусть это будет ( к примеру) IP (строкой или 4 байтами).
Все будет определяться задачей. Это может быть и (опять же к примеру) логин пользователя.
Но, тем не менее - уели :)
Сергей М. (2008-06-15 15:39:00) [2]
> До поры до времени, пока кто-то не окажется за НАТ
Или за прокси-сервером.
> вряд ли на одном компьютере будет устанавливаться 2 клиента
> чата.
А никто и не говорил об этом.
Два клиента на разных хостах для доступа к серверу пользуются одним и тем же NAТ- или proxy-сервисом - сервер будет их "видеть" под одним и тем же IP-адресом, но под разными портами.
Тын-Дын (2008-06-14 10:21:00) [3]
> Андрей (13.06.08 13:36) [9]
>
> > До поры до времени, пока кто-то не окажется за НАТ
>
> Сделайте одолжение - расшифруйте эту фразу :)
А что тут расшифровывать? Клиенты, сидящие за NAT, имеют один и тот же адрес IP. отличаются только портом, который NAT выдаёт.
Андрей (2008-06-13 13:40:00) [4]
> kami ©
Спасибо за пример, попробую.
Андрей (2008-06-13 13:36:00) [5]
> До поры до времени, пока кто-то не окажется за НАТ
Сделайте одолжение - расшифруйте эту фразу :)
Anatoly Podgoretsky (2008-06-12 08:32:00) [6]> kami (12.06.2008 0:56:07) [7]
До поры до времени, пока кто-то не окажется за НАТ
kami (2008-06-12 00:56:00) [7]> комбинацией IP-адрес:порт
Согласен целиком и полностью. Но вряд ли на одном компьютере будет устанавливаться 2 клиента чата.
> интересующая инф-ция о клиентах (RemoteAddress в частности
> ) доступна в списке Connections
Да, но в этом случае поиск нужного клиента будет проводиться явно, а не скрываться в методах TStringList.
Сергей М. (2008-06-11 20:56:00) [8]
> kami © (11.06.08 15:48) [5]
Во-первых, уникальность партнера определяется не IP-адресом, а комбинацией IP-адрес:порт.
Во-вторых, городить огород со списком FClientList нет никакого резона -
интересующая инф-ция о клиентах (RemoteAddress в частности ) доступна в списке Connections.
kami (2008-06-11 15:48:00) [9]> Один из пользователей отправляет сообщение (данные) другому
> через сервер
Следовательно, в заголовке сообщения (данных) присутствует идентификатор того, кому эти данные адресованы.
Пусть это будет (к примеру) 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;
Конечно же, в примере не учитывается обработка ошибок и склейка/разбиение пакетов.
Андрей (2008-06-11 10:32:00) [10]Не разобрался еще, как тут вставляются цитаты, поэтому такое сообщение получилось :)
Андрей (2008-06-11 10:30:00) [11]
> DVM ©
</I
> kami ©
>
Использую стандартный набор ServerSocket/ClientSocket
Принцип такой же, как в обычном чате. Один из пользователей отправляет сообщение (данные) другому через сервер. Как серверу определить, что инфу надо послать не всем сразу, а конкретному пользователю без перебора всего списка подключенных к нему?
kami (2008-06-07 22:30:00) [12]> Андрей (07.06.08 11:52) [0]
1. Сперва скажи, какие сетевые компоненты и с какими настройками используешь
2. Можно.
3. см.1
4. Да.
DVM (2008-06-07 17:00:00) [13]
> Уважаемые, подскажите, как осуществляется отправка инфы
> конкретному клиенту по сокетам? Можно ли отправить напрямую
> без перебора всех активных.
Конкретный клиент это который? В любом сучае у тебя будет список и поиск конкретного надо будет в нем выполнять.
> существует ли какой-нибудь идентификатор при подключении
> клиента к серверу?
Этот индентификатор и есть сокет.
> Как определить нужного клиента в этом случае?
Нужного кому? И для чего?