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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2010, 17:25   #511
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

1.
Цитата:
Если не обращаете внимание на содержание ошибки (Delphi всегда пишет что ему не нравится в нижнем окне кода, кроме того указывает строку)
Всегда обращаю и если знаю что делать, то делаю

Цитата:
это i4, в ней ячейка, т.е. берем ее текущее значение: FalseName := i4;
был почти рядом, но не решился такое прописать

Цитата:
смысл это все писать? ...смысла ноль, ...исправьте.
исправил в тот день, когда задали вопрос на засыпку

Цитата:
в событии на дисконнект прописать условие, что если переменная FalseName больше 0, то прописать простой код, где очищаются все записи ячейки массива, что показывает переменная FalseName, ...следом ее обнуление. В противном случае (FalseName = 0) пусть срабатывает флаг обновления UpdMas := True;
Так
Код:
procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if CheckConnect = False then
    begin
      StatusBar1.Panels[2].Text := '[' + TimeToStr(Now) + '] Клиент отключился';

      // Разрешаем обновление
      UpdMas := True;
    end;

  if FalseName > 0 then
    FalseName := 0
  else

  CheckConnect := False; // Сброс флага
end;
2. Сделал возможность писать личку в отдельном окне, но не понравилась реализация на сервере. Отправка простых сообщений с сервера/клиента ведётся с Form1, а отправка приватных с Form7. Тоесть получается код на отправку сообщения я разделил и разбросал на две формы.
Вот расклад сервера (Code.txt).
Ненравиться место // Создаем цикл поиска приватного пользователя так как там используется общая переменная i: word, которая объяволена в Form1. В Form7 я её тоже объявил как переменную, но похоже сделал ошибку.
Вложения
Тип файла: txt Code.txt (2.4 Кб, 127 просмотров)

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

Код:
  if FalseName > 0 then
    FalseName := 0
  else
Чего-то не понял смысл такого кода, ...нет содержания ни в первом ни во втором случае исхода условия.

Цитата:
Сообщение от Shouldercannon
Ненравиться место // Создаем цикл поиска приватного пользователя так как там используется общая переменная i: word, которая объяволена в Form1. В Form7 я её тоже объявил как переменную, но похоже сделал ошибку.
У каждой формы своя секция Var, создавая переменную i в другой форме, вы совершенно не рискуете нарушить циклы по такой же переменной i в главной форме, ...это как бы разные переменные.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.06.2010, 19:55   #513
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Код:
  if FalseName > 0 then
    FalseName := 0
  else
Чего-то не понял смысл такого кода, ...нет содержания ни в первом ни во втором случае исхода условия.
Значит я не понял как реализовать
Цитата:
в событии на дисконнект прописать условие, что если переменная FalseName больше 0, то прописать простой код, где очищаются все записи ячейки массива, что показывает переменная FalseName, ...следом ее обнуление.
Цитата:
очищаются все записи ячейки массива, что показывает переменная FalseName
она показывает i4, значит её чистим.
Цитата:
следом ее обнуление
i4 обнуляем.

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

Что-то тоскливо становится
Цитата:
Сообщение от Beermonza
...очищаются все записи ячейки массива...
Массив один у вас, это UserMas, номер ячейки содержит FalseName, для этого она и создавалась. Значит UserMas[FalseName], ...так? ...вы вышли нужную ячейку массива.
Записи берутся через точку, и освобождаются, чтобы последующее срабатывание обновления когда-либо не обнаружило изменений:

Код:
UserMas[FalseName].Status := 0;
UserMas[FalseName].Rec := False;
Это нужно поместить в тело условия в истинность, а в ложность - флаг обновления:

Код:
If FalseName > 0 then
  Begin
    UserMas[FalseName].Status := 0;
    UserMas[FalseName].Rec := False;
    FalseName := 0;
  end
else UpdMas := True;
По моему все точно соответствует словесному описанию.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 30.06.2010, 17:09   #515
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Снова что-то не так, список попрежнему обновляется
Код:
procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  if CheckConnect = False then
    begin
      StatusBar1.Panels[2].Text := '[' + TimeToStr(Now) + '] Клиент отключился';

      // Разрешаем обновление
      UpdMas := True;
    end;

  if FalseName > 0 then
    begin
      UserMas[FalseName].Status := 0;
      UserMas[FalseName].Rec := False;
      FalseName := 0;
    end
    else
    UpdMas := True;

  CheckConnect := False; // Сброс флага
end;
Наверно нужна ещё защита в событии ServerSocketClientConnect
Shouldercannon вне форума Ответить с цитированием
Старый 30.06.2010, 18:21   #516
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В процедуре коннекта нужно поменять местами закрытие канала и флаг:
Код:
procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
Label G; // Метка
var
  d: Integer;
begin

  ...

  // Закрыть канал
  if d = 0 then
    begin
      
      CheckConnect := True;  // сначала значение флага
      Socket.Close;                // затем закрытие, сразу сработает ServerSocketClientDisconnect
                                           // там уже нужно знать значение флага CheckConnect

      GoTo G; // Переход в метку
    end;

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

И так список обновляется и производится connect/disconnect.
При
Код:
CheckConnect := True;
Socket.Close;
убивается защита обновления списка при работе с диапазонами, подключился/отключился не выводится, а список обновляется.
Прям кошмар какой-то. Никак не одолеть.

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

Вы что-то не договариваете, ...если совсем все плохо, кидайте исходник в личку, ...как еще помочь я не знаю.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.07.2010, 22:42   #519
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Shouldercannon, мне не удалось запустить ваш проект, поскольку просто нет половины компонентов, что были в нем, ...кроме того недоставало форм, ...и на главной я не обнаружил серверный сокет, только клиентский был, ...да и не важно все это. Хочу сказать одно, проект BZChat был создан на столько непрошибаемым, что сервер всегда будет отслеживать изменения и всегда обновлять список, как бы не старались остаться незамеченными клиенты, или как бы не совершенствовалась система быстрого скрытого выпинывания нежелательных клиентов.
Вам придется использовать событие ServerSocketClientRead сервера, которое зарегистрирует первый пакет клиента сразу после его соединения с сервером, в котором будет ник, может даже пароль. Тут же оперативная проверка пакета и решение. Но, дисциплины и строгости уже не будет, кроме того нужна проверка на подлинность пакета и тип ответа.

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

Цитата:
и на главной я не обнаружил серверный сокет, только клиентский был
Сервер и клиент у меня разделены (два разных приложения)

И действительно. От этого больше проблем, чем пользы. Если из-за проверки на одинаковые ники может всё рухнуть, это того не стоит. Но тогда придётся разрешить проблему с баном одинаковых ников. Единственное, что у ников разное - это IP-Адрес. Тогда тут придётся как то обращаться к IP
Код:
procedure TFormMain.BanYes;
var
  i2, i3: Integer;
begin
  if UserListView.Items.Count > 1 then
    begin
      // Поиск ника в UserMas
      for i3 := 1 to ServerSocket.Socket.ActiveConnections do
        begin
          if UserMas[i3].Name = BannedUnbannedNick then
            begin
              // Получим IP забаненого
              BannedUnbannedIP := ServerSocket.Socket.Connections[i3 - 1].RemoteAddress;
              // Отошлём команду бана
              ServerSocket.Socket.Connections[i3 - 1].SendText('21');
              // Поместим IP забаненого в базу
              BanIP.Add(BannedUnbannedIP);
              // Добавим событие бана в ServerLog
              ServerLog.Add('[' + DateTimeToStr(Now) + '] ' + FormSettings.ENick.Text + ' забанил '
              + BannedUnbannedNick + ', IP: ' + BannedUnbannedIP + '. Причина: ' + FormReason.EReason.Text);
              // Сохраняем ServerLog, BanIP и обновляем массив бана
              SaveServerLogBanIP;

              // Отправляем сообщение с сервера всем пользователям
              for i2 := 0 to ServerSocket.Socket.ActiveConnections - 1 do
                begin
                  ServerSocket.Socket.Connections[i2].SendText('12' + FormSettings.ENick.Text + ' забанил '
                  + BannedUnbannedNick + '. Причина: ' + FormReason.EReason.Text);
                end;

              // Отобразим сообщение в ChatView
              ChatView.AddNL('[' + TimeToStr(Now) + '] ', 1, 0);
              ChatView.AddText(FormSettings.ENick.Text + ' забанил ' + BannedUnbannedNick + ', IP: '
              + BannedUnbannedIP + '. Причина: ' + FormReason.EReason.Text, 9);
              ChatView.Format;

              RVEChatAutoscroll;

              // Сбрасываем цикл
              Break;
            end;
        end;
    end;
end;

Последний раз редактировалось Beermonza; 02.07.2010 в 14:55.
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