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

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

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

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

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

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

1. Если с запретом одинаковых ников ничего не получается, может им делать допись? Например в чате есть Вася, тут заходит ещё один вася и регестрируется как Вася 2, тут ещё один Вася, а он в свою очередь регистрируется как Вася 3. Это наверно уже единственный способ.

2.
Цитата:
Сообщение от Shouldercannon
1. В данной модели чата реально генерировать ID по IP? С ID будет проще управлять клиентами (бан, админка и т.д.).

Номер канала строго связан с листом коннектов компонента сокета, они нумеруются от 0 и до количества каналов - 1. Если делать событийный опрос и обработку по сокету и указателю (технически нагляднее), то модель защиты, путем построения клиентов в очередь, рушится.
Значит нельзя.

3. 1. Когда в чате много юзеров и кто-то кому-то пишет личное сообщение, то оно теряется среди множества простых сообщений (приходится листать чат и искать). Хочу делать вывод лички в отдельное окно. Здесь наверно придётся создавать компоненты динамически, опыта в этом у меня пока нет.
Как будет работать по моим соображениям:
1. Отправка приватного сообщения будет производиться из отдельного окна, вызванного двойным кликом по нику. В заголовок TabSheet (PageControl) забъётся ник выбранного юзера, этот же заголовок будет забиваться в address при отправке из текущей вкладки (TabSheet). Если вкладка с данным ником существует, то перейти к ней без повторного создания
2. по приходу личного сообщения также будет создана вкладка с ником отправившего. Если такая вкладка существует, то сообщение поместить в неё.

Теперь наверно самое сложное при работе с отдельной вкладкой.
По нажатию на иконку с крестиком в ToolBar закрыть текущую вкладку, тоже с прокруткой и очисткой и отправкой сообщения.

Возможно что-то я неправильно смозговал, так как такое делаю в первый раз. За основу можно взять расклад QIP.
Вложения
Тип файла: rar Project1.rar (559.7 Кб, 36 просмотров)

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

Приватных сообщений обычно не так много, можно все сводить в одно поле дополнительной формы, оно появится (Form2.Show) как только вам придет личное сообщение. Печатать можно сделать в ней же, в отдельном поле Edit. Тут пошла специфика и азы программирования, ...я не помощник, вернее не должен это объяснять.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 27.06.2010, 22:32   #503
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Что можете сказать по поводу пункта 1 предыдущего поста? Похоже он провальный так как на клиенте будет Вася, а на сервере Вася 2.

Может есть ещё какие варианты. Может ник выбивать и сверять в ServerSocketClientConnect

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

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

С выкидыванием я запоролся на игнорировании обновления списка при Connect/Disconnet и ктому же
Цитата:
1. Смотрите где вызываются обновления. Там где есть UpdMas := True;. Такое у сервера в ServerSocketClientConnect. После того как произошло событие подключения клиента, в конце таймера запустится процедура обновления массива UpdateUserMas. В ней будет создана запись, что "есть неизвестный клиент", на него отправится запрос "кто такой?", обнулится счетчик Autores.
Каждый ответ клиентов на авторизацию будет считать авторизированных. UpdateUserList в конце таймера запуститься только тогда, когда все клиенты корректно авторизируются. Если хоть один из них не пройдет код:

Код:

UserMas[i].Rec := True;
Inc(Autores);

то, обновления списка не будет. А мы знаем, что по совпадению ника, условие выполняет прыжок в метку G:.
По совпадению ника канал закрывается, вызывая событие ServerSocketClientDisconnect, в котором тоже есть флаг обновления UpdMas := True;, ...он заставляет снова проверить массив, т.е. один клиент отпал по условию совпадения ника, его запись из массива UserMas удаляется, и снова всем пользователям отсылается запрос "кто такой?". Все клиенты отвечают, Autores всех считает. На этот раз все авторизировались корректно, в конце таймера условие запустит обновление списка UpdateUserList.
Как этого избежать? ...а надо ли? ...может в момент манипуляции с нежелательным клиентом произойдут еще какие-нибудь изменения, а сервер, проверяя по массиву кто не прошел авторизацию, упустит важный момент обновления списка, ...а?
Вообще, приходится прибегнуть к слежению за сокетом и реагированием на каждое событие (событие возвращает сокет, который его вызвал), что нарушает сам принцип построения этой системы клиент сервер, когда сервер не реагирует на клиентов вне очереди и не выполняет команды немедленно, а ставит всех в очередь, дисциплинирует, и не дает над собой издеваться многочисленными запросами.
Делайте ваш выбор.
Shouldercannon вне форума Ответить с цитированием
Старый 28.06.2010, 17:19   #506
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Ну, можно же создать переменную типа FalseName: Word;, в нее записать номер ячейки массива пользователей, на которой сработало условие совпадения ника, и чей канал был закрыт, ...в событии на дисконнект прописать условие, что если переменная FalseName больше 0, то прописать простой код, где очищаются все записи ячейки массива, что показывает переменная FalseName, ...следом ее обнуление. В противном случае (FalseName = 0) пусть срабатывает флаг обновления UpdMas := True;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 28.06.2010, 19:06   #507
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Радость

Дубль два.
Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
Label G; // Метка (Игнор обновления списка юзеров при входе запрещённых клиентов)
var
..., i4: Integer;
begin
...
// Код приема ника клиента
                0: begin
                  // Запишем в массив полученный ник
                  UserMas[i].Name := Copy(text, 3, len);

                  // Проверка на наличие одинаковых ников
                  for i4 := 1 to ServerSocket.Socket.ActiveConnections do
                    begin
                      if (UserMas[i4].Name = UserMas[i].Name) and (i4 <> i) then
                        begin
                          ServerSocket.Socket.Connections[i - 1].Close;
                          FalseName := ?;
                          GoTo G; // Переход в метку
                          Break;
                        end;
                    end;

                  // Начало опасного блока, могущего вызывать слипание команд
                  // Обработка забаненых IP
                  ...
                  // Конец опасного блока

                  // Отметим, что пользователь записан в список
                  UserMas[i].Rec := True;
                  // Отметим авторизацию счетчиком
                  Inc(Autores);

                  // Обработка админов
                  ...

                  G: // Сюда перейдёт программа
                end;
Цитата:
Ну, можно же создать переменную типа FalseName: Word;, в нее записать номер ячейки массива пользователей, на которой сработало условие совпадения ника, и чей канал был закрыт,
Что подразумевается под ячейкой?

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

Массив состоит из ячеек, если я напишу так: UserMas[2].Name, то обращение будет ко 2-й ячейке, к полю Name. Т.к. тип массива создан в виде набора записей, к каждой ячейке прилагается несколько записей, которые хранят информацию в собственном типе.

Если есть цикл по-i4 и он работает со всем диапазоном массива, то какая ячейка у массива будет если на некотором шаге сработает условие, и что записать в FalseName? ...думайте

Вопрос на засыпку: если в коде есть GoTo, то break уже можно не писать, ...почему?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 28.06.2010 в 20:18.
Beermonza вне форума Ответить с цитированием
Старый 28.06.2010, 21:58   #509
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Массив состоит из ячеек, если я напишу так: UserMas[2].Name, то обращение будет ко 2-й ячейке, к полю Name. Т.к. тип массива создан в виде набора записей, к каждой ячейке прилагается несколько записей, которые хранят информацию в собственном типе.

Если есть цикл по-i4 и он работает со всем диапазоном массива, то какая ячейка у массива будет если на некотором шаге сработает условие, и что записать в FalseName? ...думайте
Если ячейку заполнять так FalseName := UserMas[i4].Name;, то ошибка так как UserMas[]. либо Status, либо Image, возможно нужно через PChar или ещё через что-то.
Цитата:
Вопрос на засыпку: если в коде есть GoTo, то break уже можно не писать, ...почему?
Break - сброс цикла при первом совпадении, GoTo - переход в конец процедуры (там где G). Вопрос хорош, честно даже не смогу сейчас на него ответить.

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

Цитата:
Сообщение от Shouldercannon
Если ячейку заполнять так FalseName := UserMas[i4].Name;, то ошибка так как UserMas[]. либо Status, либо Image, возможно нужно через PChar или ещё через что-то.
По ходу вы не четко знаете чего хотите от кода. FalseName какого типа? ...word! это число, ...а UserMas[i4].Name? ...string! это строка. Если не обращаете внимание на содержание ошибки (Delphi всегда пишет что ему не нравится в нижнем окне кода, кроме того указывает строку), то дописывайте в имя сокращения, например: FalseNameWrd, UserMas[i4].NameStr и т.д.
Вернемся к коду. За номер ячейки отвечает числовая переменная i4, она в цикле считает, как только сработало условие, значит можно точно знать какая ячейка была в текущий момент, это i4, в ней ячейка, т.е. берем ее текущее значение: FalseName := i4;, все. Далее идет скачок в G: метку.
Цитата:
Сообщение от Shouldercannon
Break - сброс цикла при первом совпадении, GoTo - переход в конец процедуры (там где G). Вопрос хорош, честно даже не смогу сейчас на него ответить.
Ответ очень прост. Если программа переходит по команде в некоторую метку, то все, что после команды GoTo и до метки пропускается. В частном случае, break в теле условия после GoTo не имеет никакого значение, он не выполнится никогда, как и все, что будет написано в теле условия после GoTo, смысл это все писать? ...смысла ноль, ...исправьте.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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