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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать сколько подключено клиентов к серверу?? 
V
    Опции темы
SneG0K
  Дата 19.12.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Меня интересует такой вопрос!!! Я пишу программу-сервер к ней будет подключатся несколько клиентов юзеров и один клиент админ!
Использую TClientSocket и TServerSocket! Меня интересует, как определить, что подключился клиент админ и как определить сколько сейчас клиентов подключено к серверу??? smile 
PM WWW Skype   Вверх
Exai1e
Дата 19.12.2007, 21:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Примерно:
Кто подключился может проверить командой к примеру подключается клиент отсылается команда на сервер 'IAmClient' а если админ то 'AImAdmin' сервер обрабатывает команды и отвечает на них.
Кол-во юзеров примерно так:
ServerSocket1.Socket.ActiveConnections(Примерно так, делфи под рукой нету. Это и есть кол-во активных подключений)

p.s. почитай faq, книжки, туторы smile

Это сообщение отредактировал(а) Exai1e - 19.12.2007, 21:51


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SneG0K
Дата 19.12.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



По поводу Админского клиента! Как мне отправить данные именно на клиент админа??? И на клиенты Юзеров????? Надо, чтоб отдельно!!! smile

Добавлено через 3 минуты и 12 секунд
И еще сразу вопрос, чтоб левый топ не создавать!!! Я передаю на сервер строку 'Identification:Admin#0'  ---   так вот как мне сделать так, чтобы  программа первые 15 символов проверяла и если они ровны слову Identification:то все, что после 15 символа заносила в переменную, до символа #0??? smile  smile  smile 
PM WWW Skype   Вверх
Coderr
Дата 20.12.2007, 01:57 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

var
  recv: string;  // принятая строка
begin
 // ... кладёшь принятую строку в recv
 if (copy(recv, 1, 15) = 'Identification:') then begin
  delete(recv, 1, 15); // в принципе, если делаешь так, то и #0 не нужен. В recv уже будет лежать :)
  // ...
 end;
 // ...
end;


Добавлено через 8 минут и 13 секунд
Цитата

По поводу Админского клиента! Как мне отправить данные именно на клиент админа??? И на клиенты Юзеров????? Надо, чтоб отдельно!!!


Я бы создал специальный StringList, каждая строка которого - ip админа.
Добавляешь в этот список во время коннекта клиента(проверка на 'Identification:Admin').
Если надо отправить админу - без проблем! У нас есть список. Просто сканируем его на наличие такого ip.

PS Проверка на админа пакетом 'Identification:Admin' очень небезопасна. Я бы советовал передавать ещё и пароль зашифрованный.  smile 
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
SneG0K
  Дата 20.12.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Спасибо за совет... Учту smile 

Но вся проблема не в том, что я не могу идентифицировать админа, а в том что я не знаю как именно отправить данные  на админа! 

Код

ServerSocket1.Socket.SendText('Админ подключен');


Это же сообщение отошлется всем подключенным клиетнам?! А мне надо чтоб только одномому! Я не могу понять как это делать smile

Добавлено через 8 минут и 6 секунд
Я не могу понять как именно данные отправить админу=( 
Код

ServerSocket1.Socket.SendText('Ура.... Админ приперся');



Если так, то эта строка отправиться всем клиентам!(вродебы) А мне надо, чтобы именно на один клиент админа=)


PM WWW Skype   Вверх
Coderr
Дата 20.12.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А в чём проблемы? Кинь на форму клиентный сокет и отправляй с  него. У него есть полезные параметры: ip и порт =).
Пишешь отдельную процедуру:
Код

procedure TForm1.SendMessage(ip: string; port: integer; Msg: string);
begin
 ClientSocket.Active := False;
 ClientSocket.Address := ip;
 ClientSocket.Port := port;
 ClientSocket.Active := True;
 ClientSocket.Socket.SendText(Msg);
 ClientSocket.Active := False;
end;

Приблизительно так =)
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
Coderr
Дата 20.12.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

procedure TForm1.ServerSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  recv: string;  // принятая строка
begin
 recv := Socket.ReceiveText  // ... кладёшь принятую строку в recv
 if (copy(recv, 1, 15) = 'Identification:') then begin
  delete(recv, 1, 15); 
  if (recv = 'Admin') then
   SendMessage(Socket.RemoteAddress, Socket.RemotePort, 'Ура.... Админ приперся')
  else
   SendMessage(Socket.RemoteAddress, Socket.RemotePort, 'А... Ты поганый юзер...')
 end;
end;

--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
SneG0K
  Дата 20.12.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Цитата(Coderr @  20.12.2007,  12:55 Найти цитируемый пост)
Кинь на форму клиентный сокет и отправляй с  него

 Ты предлагаеш на форму кинуть еще один ServerSocket??? Точно! Как я раньше не додумался smile  smile 

Все спасибо smile Вопрос решен smile 
PM WWW Skype   Вверх
Coderr
Дата 22.12.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет! НЕ ServerSocket, а ClientSocket!!!
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
SneG0K
Дата 22.12.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



А зачем клиентсокет??? С серверсокетом вроде б легче было
PM WWW Skype   Вверх
WaReZMEN
Дата 26.12.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

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



Кол-во юзером узнается так 

Код

ServerSocket1.Socket.ActiveConnections;


отправить нужному юзеру

Код

ServerSocket1.Socket.Connections[номер пользователя].SendText('Привет')

по поводу аднима нужно делать авторизацию.... кстати, я тут тоже, что то подобное делал так вот лучше не 
ServerSocket ClientSocket а idTCPServer и idTCPClient (Вкладка indy Server и  indy Client) юзать там попроще будет...
Если интересно могу пример выложить...

Это сообщение отредактировал(а) WaReZMEN - 26.12.2007, 01:40
PM MAIL ICQ   Вверх
SneG0K
Дата 26.12.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Цитата(WaReZMEN @  26.12.2007,  00:31 Найти цитируемый пост)
ServerSocket1.Socket.Connections[номер пользователя]

Вот меня как рас и интересовало, как узнать, номеро того пользователя, который мне нужен???

А примерчик выложи...... очень пригодиться smile 
PM WWW Skype   Вверх
Adver_Doiren
Дата 26.12.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как узнать? Можно массивчик завести Clients: array of string , в который при OnConnect  добавлять,  IP. 
Получится , что ты по IP сможешь получить номер подключения через функцию типа:
Код

function getClientNumber(IP: string): integer;
var cnt: integer;
begin
for cnt:=0 to length(Clients)-1 do
  if IP = Clients[i]  then
    begin  
      Result := cnt;
      exit;
    end
  else
    Result := -1;
end;


А в OnDisconect запись из массива удалять.

Другой вариант - у TCustomWinSocket есть свойство Data типа поинтер, можно в OnConnect его использовать.

Имея номер пославшего, ты можешь послать сообщение всем клиентам КРОМЕ этого простым циклом с одним Ifом.

Это сообщение отредактировал(а) Adver_Doiren - 26.12.2007, 11:55
PM MAIL   Вверх
SneG0K
Дата 26.12.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


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

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



Спасибо... кажись понял
PM WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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