Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь в TServerSocket 
:(
    Опции темы
MegaBitz
  Дата 12.5.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.7.2009

Репутация: нет
Всего: нет



Вообщем я в 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('Сообщение'), от только я не знаю как узнать номер соеденения того пользователя,который прислал мне сообщение
PM MAIL   Вверх
Демо
Дата 12.5.2010, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
MegaBitz
Дата 12.5.2010, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.7.2009

Репутация: нет
Всего: нет



А подругому никак?

Добавлено через 2 минуты и 55 секунд
Или может есть какой нибудь другой компонент?
PM MAIL   Вверх
Демо
Дата 12.5.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 3
Всего: 50



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
kami
Дата 12.5.2010, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 6
Всего: 72



Цитата(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.

Это сообщение отредактировал(а) kami - 12.5.2010, 17:46
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.