Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2013, 15:33   #711
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Забыл почему на сервере цикл с 1 по количество подключений, а отправка ведётся в канал - 1

Это из-за клиента, который поумолчанию создаётся?
Нет, ...это потому, что ActiveConnections возвращает фактическое число каналов, ...их "0" быть не может. А Connections - это массив каналов, который как и все массивы имеет счисление от нуля.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.01.2013, 21:00   #712
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Не помню уже было или нет, но как проверить на активность конкретное соединение на сервере?
Shouldercannon вне форума Ответить с цитированием
Старый 14.01.2013, 22:33   #713
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Сервер не держит неактивных соединений, сокет удаляется автоматически, номера каналов перераспределяются.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 15.01.2013, 06:55   #714
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Допустима ли следующая реализация:
# При подключении клиент отсылает на сервер Login, после чего сервер добавляет пользователя в массив и рассылает список по всем клиентаи
# При отключении кого-либо или ошибке сокета перебираем оставшиеся подключения и выкидываем отвалившихся из массива. Только здесь проблема, по чему проверку делать?

Последний раз редактировалось Shouldercannon; 15.01.2013 в 09:01.
Shouldercannon вне форума Ответить с цитированием
Старый 15.01.2013, 18:12   #715
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shouldercannon, логика не совсем правильная, ...а точнее не защищенная. Сервер должен спрашивать кто таков клиент, а не наоборот. При появлении коннекта идет проверка IP, БД заблоченных или недопустимых. Потом пауза, ...если клиент "вякнет", то выбросить его из чата. Если будет молчать непозволительное время - выбросить из чата. Подумай хорошо.

Сервер подаст запрос клиенту, и тот должен корректно ответить, ...в противном случае - выбросить из чата. И т.д. и т.п. ...все возможные варианты поведения клиента.

У сокета и конкретного канала есть свойство Data, там удобно хранить указатель на ячейку массива в которой "прописан" клиент. При перераспределении каналов нумерация меняется, а указатель остается. Примени для индексирования пользователей.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.01.2013, 05:02   #716
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
ShouldercannonСервер должен спрашивать кто таков клиент, а не наоборот.
Я же просто предлагаю при подключении отослать с клиента команду Login, а не делать запрос у сервера на отправку Login.

Ещё напрягает момент с сервером, если один из клиентов не отвечает, то сервер ждёт ответа и список клиентов не появляется ни у кого, а ведь клиент может не ответить вообще.
Shouldercannon вне форума Ответить с цитированием
Старый 16.01.2013, 16:02   #717
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Я же просто предлагаю при подключении отослать с клиента команду Login, а не делать запрос у сервера на отправку Login.

Ещё напрягает момент с сервером, если один из клиентов не отвечает, то сервер ждёт ответа и список клиентов не появляется ни у кого, а ведь клиент может не ответить вообще.
Именно поэтому я предложил переделать протокол, ...смотри в будущее.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.01.2013, 18:12   #718
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Забыл почему на сервере цикл с 1 по количество подключений, а отправка ведётся в канал - 1
Код:
procedure TFormMain.PLVUMRefreshNickClick(Sender: TObject);
begin
  if LVUsers.Items.Count > 1 then
  begin
    for i := 1 to ServerSocket1.Socket.ActiveConnections do
    begin
      if UserMas[i].Nick = LVUsers.Items[LVUsers.ItemIndex].Caption then
      begin
        ServerSocket1.Socket.Connections[i - 1].SendText('11');
      end;
    end;
  end;
end;
Это из-за клиента, который поумолчанию создаётся?
Цитата:
Сообщение от Beermonza Посмотреть сообщение
Нет, ...это потому, что ActiveConnections возвращает фактическое число каналов, ...их "0" быть не может. А Connections - это массив каналов, который как и все массивы имеет счисление от нуля.
Хорошо, а почему тогда здесь с 0 по -1?
Код:
// пробегаем по всем открытым каналам
        For i:=0 to ServerSocket.Socket.ActiveConnections-1 do
          Begin
// отправим строку списка пользователей (код команды - 2)
            ServerSocket.Socket.Connections[i].SendText('2'+StrUserList);
          end;
      end;
Тут с 1. Опять непонятки
Код:
// заполняем данные пользователей
  If ServerSocket.Socket.ActiveConnections<>0 then
    Begin
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
          UserMas[i].Status:=2;
          UserMas[i].Name:='Неизвестный';
          UserMas[i].Image:=0;
// запрашиваем имя (ник) пользователя по его каналу (код команды - 1)
          ServerSocket.Socket.Connections[i-1].SendText('1');
        end;
    end;

// цикл по существующим каналам
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
// сохраним пакет (если ничего не прислали, по пакет пустой)
          text:=ServerSocket.Socket.Connections[i-1].ReceiveText();
И ещё один момент
Код:
procedure TForm1.ServerBtnClick(Sender: TObject);
begin
  If ServerBtn.Tag=0 then
    Begin
// клавишу ClientBtn и поля HostEdit, PortEdit, NikEdit заблокируем
      ClientBtn.Enabled:=False;
      HostEdit.Enabled:=False;
      PortEdit.Enabled:=False;
      NikEdit.Enabled:=False;
// запишем указанный порт в ServerSocket
      ServerSocket.Port:=StrToInt(PortEdit.Text);
// запускаем сервер
      ServerSocket.Active:=True;
// добавим в ChatRichEdit сообщение с временем создания
// сразу зададим параметры шрифта (Arial, 8, красный, курсив)
      ShowColorMassage('00119['+TimeToStr(Time)+']  Сервер создан.', 2);
// изменяем тэг
      ServerBtn.Tag:=1;
// меняем надпись клавиши
      ServerBtn.Caption:='Закрыть сервер';
// включаем таймер сервера
      ServerTimer.Enabled:=True;
// вписываем параметры сервера
      UserMas[0].Status:=1;
      UserMas[0].Rec:=True;
      UserMas[0].Name:=NikEdit.Text;
      UserMas[0].Image:=1;
// разрешаем обновление
      UpdDo:=True;
    end
  else
    Begin
// выключаем таймер сервера
      ServerTimer.Enabled:=False;
// стираем параметры сервера
      UserMas[0].Status:=0;
      UserMas[0].Rec:=False;
      UserMas[0].Name:='Неизвестный';
      UserMas[0].Image:=0;
// разрешаем обновление
      UpdDo:=True;
// очищаем список клиентов
      UserListView.Items.Clear;      
// клавишу ClientBtn и поля HostEdit, PortEdit, NikEdit разблокируем
      ClientBtn.Enabled:=True;
      HostEdit.Enabled:=True;
      PortEdit.Enabled:=True;
      NikEdit.Enabled:=True;
// закрываем сервер
      ServerSocket.Active:=False;
// выводим сообщение в ChatRichEdit
// сразу зададим параметры шрифта (Arial, 8, красный, курсив)
      ShowColorMassage('00119['+TimeToStr(Time)+']  Сервер закрыт.', 2);
// возвращаем тэгу исходное значение
      ServerBtn.Tag:=0;
// возвращаем исходную надпись клавиши
      ServerBtn.Caption:='Создать сервер';
    end;
end;
Если впмсывания и стирания параетров сервера не будет, то UpdDo:=True; в данном обработчике будет не нужен?

Последний раз редактировалось Shouldercannon; 25.01.2013 в 19:39.
Shouldercannon вне форума Ответить с цитированием
Старый 26.01.2013, 15:55   #719
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon
Хорошо, а почему тогда здесь с 0 по -1?
...
Тут с 1. Опять непонятки
В первом случае обращение только к каналам, поэтому нумерация проводится от 0. Во втором случае в коде присутствует обращение к ячейкам массива, и для сопоставления номера канала и ячейки я использовал прямой адрес. Ячейка 0 принадлежит серверу.

Если приложение является только сервером, то процедура всё равно нужна. Это кнопка "вкл/выкл" сервера, ...или он будет выключаться с помощью "Диспетчера задач"?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 26.01.2013, 17:16   #720
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Что-то не догоню.
1. Если я из обработчика запска/остановки сервера удалю все упоминания о сервере (ячейка массива [0]), то
Код:
// разрешаем обновление
      UpdDo:=True;
всёравно нужно будет оставить?
2. Если я полностью искореню все записи о сервере (ячейка массива [0]), вообще выкину его, то все циклы связанные с ServerSocket можно делать с 0 по - 1 и даже здесь убрать + 1
Код:
if UserMas[i2 + 1]
?
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновление в блоге - Создание клиент-сервера Pblog Обсуждение статей 0 03.10.2007 17:12
обновление в блоге - Диплом. Создание и продвижение сайта - готовь сани летом, а дипл Pblog Обсуждение статей 0 31.08.2007 20:00
обновление в блоге - USB Холодильник Pblog Обсуждение статей 0 25.06.2007 14:13
обновление в блоге - О ярлыках Pblog Обсуждение статей 0 27.05.2007 03:17