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

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

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

Восстановить пароль

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

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

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
На примере простого сообщения
Код:
ClientSocket.Socket.SendText('0'+Form2.ENick.Text+';'+':  '+MMessage.Text);
разделителем ника и текста сообщения является ";"
Теперь самое интересное, его надо обработать
Как это будет выглядеть?
Нужно ознакомиться с процедурой обработки списка пользователей на стороне клиента, а именно с ClientSocketRead:
Код:
...
// примем строку списка пользователей
    2: Begin
// очищаем список клиентов
         UserListView.Items.Clear;
// добавим ключ конца строки (т.к. вырезка символов с задержкой)
         text:=text+Chr(152);
// укажем начальный символ
         pos:=2;
// обнулим счетчик символов
         x:=0;
// пробегаем по длине строки списка
         For j:=2 to len+1 do
           Begin
// записываем в счетчик сдвиг
             x:=x+1;
// если найден ключ (отделение ников в строке)
             If Copy(text,j,1)=Chr(152) then
               Begin
// добавим в UserListView строку
                 UItems:=UserListView.Items.Add;
                 UItems.Caption:=Copy(text,pos,x-1);
// укажем соответствующую иконку пользователя
                 If pos>2 then UItems.ImageIndex:=0 else UItems.ImageIndex:=1;
// изменим текущую позицию в строке списка
                 pos:=j+1;
// обнулим счетчик символов
                 x:=0;
               end;
           end;
       end;
...
Немножко подумаем. Логика данного кода такова: ставим указатель в начало принятой строки и сканируем каждый символ, сверяем его с ключом конца, если ключ еще не найден, переносим позицию на 1, т.е. на следующий символ, и так, пока не найдется ключ.
Для этого нужен цикл по-j от 2 до len, в нем условие с вырезкой символа Copy(text,j,1), или text[j] (что равноценно, если вырезается один символ) и сравнением с ключом. В теле условия нужна текстовая переменная, которая наполняется проверенными символами, допустим TempName := TempName + text[j]; ...эта переменная до цикла должна быть обнулена. Как условие найдет ключ, нужно сбросить цикл, использовать break. Ник пользователя, приславшего пакет будет в переменной TempName.
Итак, цикл сброшен, j хранит позицию на которой находится ключ. Достаточно прибавить к j единицу, и это - позиция с которой нужно начинать вырезать содержимое пакета до его конца len. Возможно потребуется коррекция, нужно смотреть не обрезает ли код конец, соответственно, добавлять к len константу (все зависит от ключа команды в начале пакета).

Послесловие: ...я бы рекомендовал использовать в качестве ключа определения ника символ, который нельзя ввести с клавиатуры, это Chr(128), Chr(129), Chr(131) - Chr(138), Chr(140) - Chr(144), Chr(152) - Chr(154), Chr(156) - Chr(165), Chr(174) - Chr(182) и пр.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 02.06.2009 в 16:29.
Beermonza вне форума Ответить с цитированием
Старый 02.06.2009, 20:07   #192
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Если я правильно понял, то ключ определения должен отсылаться в сообщении
Код:
ClientSocket.Socket.SendText('0'+Form2.ENick.Text+Chr(154)+':  '+MMessage.Text);
Shouldercannon вне форума Ответить с цитированием
Старый 02.06.2009, 22:46   #193
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Если я правильно понял, то ключ определения должен отсылаться в сообщении
Код:
ClientSocket.Socket.SendText('0'+Form2.ENick.Text+Chr(154)+':  '+MMessage.Text);
Конечно, иначе никак это не сделать.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 03.06.2009, 21:25   #194
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Нужно ознакомиться с процедурой обработки списка пользователей на стороне клиента, а именно с ClientSocketRead:
Код:
...
// примем строку списка пользователей
    2: Begin
// очищаем список клиентов
         UserListView.Items.Clear;
// добавим ключ конца строки (т.к. вырезка символов с задержкой)
         text:=text+Chr(152);
// укажем начальный символ
         pos:=2;
// обнулим счетчик символов
         x:=0;
// пробегаем по длине строки списка
         For j:=2 to len+1 do
           Begin
// записываем в счетчик сдвиг
             x:=x+1;
// если найден ключ (отделение ников в строке)
             If Copy(text,j,1)=Chr(152) then
               Begin
// добавим в UserListView строку
                 UItems:=UserListView.Items.Add;
                 UItems.Caption:=Copy(text,pos,x-1);
// укажем соответствующую иконку пользователя
                 If pos>2 then UItems.ImageIndex:=0 else UItems.ImageIndex:=1;
// изменим текущую позицию в строке списка
                 pos:=j+1;
// обнулим счетчик символов
                 x:=0;
               end;
           end;
       end;
...
Немножко подумаем. Логика данного кода такова: ставим указатель в начало принятой строки и сканируем каждый символ, сверяем его с ключом конца, если ключ еще не найден, переносим позицию на 1, т.е. на следующий символ, и так, пока не найдется ключ.
Для этого нужен цикл по-j от 2 до len, в нем условие с вырезкой символа Copy(text,j,1), или text[j] (что равноценно, если вырезается один символ) и сравнением с ключом. В теле условия нужна текстовая переменная, которая наполняется проверенными символами, допустим TempName := TempName + text[j]; ...эта переменная до цикла должна быть обнулена. Как условие найдет ключ, нужно сбросить цикл, использовать break. Ник пользователя, приславшего пакет будет в переменной TempName.
Итак, цикл сброшен, j хранит позицию на которой находится ключ. Достаточно прибавить к j единицу, и это - позиция с которой нужно начинать вырезать содержимое пакета до его конца len. Возможно потребуется коррекция, нужно смотреть не обрезает ли код конец, соответственно, добавлять к len константу (все зависит от ключа команды в начале пакета).

Послесловие: ...я бы рекомендовал использовать в качестве ключа определения ника символ, который нельзя ввести с клавиатуры, это Chr(128), Chr(129), Chr(131) - Chr(138), Chr(140) - Chr(144), Chr(152) - Chr(154), Chr(156) - Chr(165), Chr(174) - Chr(182) и пр.
Хм сложновато. А нельзя сразу при добавлении текста в RichEdit произвести копирование
команда отсыла сообщения будет выглядеть так
Код:
ClientSocket.Socket.SendText('0'+Chr(154)+Form2.ENick.Text+Chr(154)+':  '+MMessage.Text);
добавляем в RichEdit
скопирует значение начиная с первого Chr(154) (ник), скопируем значение со второго Chr(154) (текст сообщения)
Shouldercannon вне форума Ответить с цитированием
Старый 03.06.2009, 21:58   #195
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Все равно нужно перебирать байты.
Код:
скопирует значение начиная с первого Chr(154) (ник), скопируем значение со второго Chr(154) (текст сообщения)
Что вообще логически это значит? ...чтобы что-то в пакете найти, нужно от начала сканировать на предмет ключа. Или в ключ команды вшить длину ника, приславшего пакет. В любом случае от перебора и манипуляции не избавиться. Это легко, когда с клиента посылаешь пакет, и у него же в поле отображение его сообщения, там элементарное копирования с полей ника привата. А если пакет получает тот, кто не писал приват, как он узнает сколько там символов в нике отправителя? ...только со сканированием.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.06.2009, 13:45   #196
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
Вопрос Бан система

Вопрос по бан систему

Сама эта система бан сбоев не даст?
И бывают ли одинаковые IP?

Последний раз редактировалось mnbvcxz11; 14.06.2009 в 13:51.
mnbvcxz11 вне форума Ответить с цитированием
Старый 14.06.2009, 17:53   #197
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от mnbvcxz11 Посмотреть сообщение
Сама эта система бан сбоев не даст?
И бывают ли одинаковые IP?
Сплошь и рядом один IP-адрес на подсеть в Интернете, и не возможно ошибиться или обойти бан в ЛВС.
Т.е. если мы баним в Интернете IP-адрес, то возможно, если там подсеть, то все остальные, пользующие этот чат, тоже не зайдут, такова реальность.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.06.2009, 18:41   #198
mnbvcxz11
Пользователь
 
Аватар для mnbvcxz11
 
Регистрация: 07.05.2009
Сообщений: 36
Вопрос Отправка файлов

В этой программе возможно отправить файлы
хотя бы по локальной сети.
Как это можно сделать?
mnbvcxz11 вне форума Ответить с цитированием
Старый 15.06.2009, 15:36   #199
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Эта программа задается основной целью: "передать текст". Если нужно передать файлы, пожалуйста, создавайте Stream и отправляйте любые файлы, хоть в ЛВС, хоть в Интернет. Как это делается найдете в разделе форума "Работа с сетью в Delphi".
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 16.06.2009, 15:41   #200
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию Личные сообщения

Смотрел код отправки личных сообщений, как то все слишком накручено...
Я реализовал таким образом:
1. Если личное сообщение - ставлю код команды 4 и цепляю к нему НЕ НИК которому отсылаю сообщение, а его порядковый номер в списке пользователей (он одинаковый у всех пользователей и на сервере, ЭТОТ метод более правильный т.к. в списке может быть 2 и боле пользователей с одинаковым именем Вася, Коля и т.д.)
2. При разборе сообщения проверяю код, если 4 - отсылаю только в канал которому предназначено сообщение.
Жду критики от автора...

Вопрос автору:
как реализовать отправку сообщения серверу при разсоединении клиента?
При нажатии на кнопку реализовал таким способом:
1. отправляю сообщение серверу что клиент такой-то отключился
2. включаю таймер и жду 1 сек.
3. разрываю соединение
но КАК ето осуществить непосредственно в процедуре "Dicconnect" клиента ума не приложу...
Когда пишу в процедуре "Dicconnect" отправку сообщения оно не успевает уйти т.к. (я так понимаю) что процедура отключения происходит быстрее чем уходит сообщение, подскажите, как реализовать?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 16.06.2009 в 16:03.
spirit-ua вне форума Ответить с цитированием
Ответ


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