Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Помощь в TServerSocket


Автор: MegaBitz 12.5.2010, 13:15
Вообщем я в Delphi новичек, и у меня возникла такая проблема, я пишу сервер с помощью компонента TServerSocket, к серверу будет подключено нескольно клиентов, как мне узнать в этой процедуре номер соеденения, от которого пришло сообщение:
Код

procedure TfrmMain.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var s: string;
id:Integer;
begin
  s := Socket.ReceiveText;
  id := Суда нужен номер соеденения;
  addConsl('id:'+IntToStr(id)+'-> '+s);
end;


Тоесть конкретный пользователь прислал мне сообщение, и программа должа только ему отправить ответ, а не все подключенным пользоваетлям. Как отправить я знаю: ServerSocket1.Socket.Connections[номер соеденения].SendText('Сообщение'), от только я не знаю как узнать номер соеденения того пользователя,который прислал мне сообщение

Автор: Демо 12.5.2010, 16:49
Цитата(MegaBitz @  12.5.2010,  13:15 Найти цитируемый пост)
от только я не знаю как узнать номер соеденения того пользователя,который прислал мне сообщение


Для этого при подключении клиента нужно обменяться какими-либо данными для идентификации клиента и сохранить их в своём приложении.

Автор: MegaBitz 12.5.2010, 17:07
А подругому никак?

Добавлено через 2 минуты и 55 секунд
Или может есть какой нибудь другой компонент?

Автор: Демо 12.5.2010, 17:12
Цитата(MegaBitz @  12.5.2010,  17:07 Найти цитируемый пост)
А подругому никак?


Ну а как ты идентифицируешь клиента?
Если устроит IP, с которого клиент подключается, то больше ничего не нужно.
См. свойства TCustomWinSocket, по-моему, свойство RemoteHost или подобное.

Автор: kami 12.5.2010, 17:45
Цитата(MegaBitz @  12.5.2010,  13:15 Найти цитируемый пост)
 конкретный пользователь прислал мне сообщение, и программа должа только ему отправить ответ, 

Индекс соединения здесь не нужен. От него плясать нельзя категорически. Плясать нужно от параметра Socket:TCustomWinSocket, который есть в событии OnRead.
Пример:
Код

procedure TfrmMain.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var s: string;
begin
  // уже здесь от Socket можно узнать: RemoteAddress и RemotePort, которые идентифицируют клиента,
  // и так далее и в том же духе.
  s := Socket.ReceiveText;
  // обработали полученное из соединения
  
  // и отправляем ему (этому пользователю) ответ:
  Socket.SendText('бла-бла-бла');
end;

Цитата(MegaBitz @  12.5.2010,  13:15 Найти цитируемый пост)
Как отправить я знаю: ServerSocket1.Socket.Connections[номер соеденения].SendText('Сообщение'), от только я не знаю как узнать номер соеденения того пользователя,который прислал мне сообщение

Так отправлять возможно, но крайне нежелательно. Поясню почему:
Узнал ты индекс нужного соединения, а потом раз - и оборвалось другое соединение. Оно исключилось из Connections. Это осталось рабочим, но индексы поплыли и пытаясь отправить в соединение по узнанному ранее индексу на самом деле отправишь другому (это в случае, если не получишь ошибку List index out of bounds).

Посему - если что-то и запоминать, то не id, а сам Socket.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)