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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2009, 12:03   #71
parinoff
 
Регистрация: 21.11.2008
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Достаточно просто. Программа и сейчас является клиент-серверной. Вам не нужны будут коды управления клиентским сокетом и некоторые его клавиши. Нужно сделать копию с архива, зайти в среду Delphi и вырезать все, что связано с ClientSocket для серверной части, и в другом проекте вырезать все, что связано с ServerSocket для клиентской части.
А ну в принципе я так и сделал))
Спасибо))

Еще вопросик, а как реализовать оффлайновые сообщения и постоянный контакт лист? чтобы юзер когда выходит он не исчезал, а становился серым)
parinoff вне форума Ответить с цитированием
Старый 23.03.2009, 15:29   #72
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

У массива UserMas[i] есть запись Status, ее значение 0 - запись пустая, не использующаяся; 1 - запись занята, там записан подключившийся клиент. Задайте еще одно значение: 2 - офлайн пользователь. Кроме того нужно создать файл, где записаны все когда-либо подключавшиеся пользователи, и при его чтении нужно записывать в массив UserMas[i] данные пользователя с файла, в UserMas[i].Status записывать 2.
В процедуре UpdateUserList добавить условие, если UserMas[i].Status = 2, то добавлять в список пользователя всегда, не удалять его при обновлении и опросе. Цвет изменить нельзя, но можно поставить другую иконку.
Оффлайновые сообщения нужно хранить так же в массиве и в файле. Добавьте запись в тип TUserList примерно такую:
Код:
Type
  ...
  OffMsg: array[0..9] of String;     // 10 сообщений
 end;
Разумеется, нужно переписать серверные условия на приватный прием. Принцип: если пользователь найден, и Status <> 2, то отсылаем приватное сообщение ему, ...следом идет условие: если пользователь найден, и Status = 2, то открываем цикл, в нем счетчик считает сообщения, типа Inc(t), и сохраняет текст сообщения в UserMas[i].OffMsg[t], и условие на переполнение счетчика: если t > 9, то t = 0; Вот в принципе и все.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 24.03.2009, 10:34   #73
BiT
 
Аватар для BiT
 
Регистрация: 24.03.2009
Сообщений: 5
По умолчанию

У меня не получается сделать звук для входящего приватного сообщения тоесть незнаю как обработать события.

+Реализуйте бан пожалуйста!

Последний раз редактировалось BiT; 24.03.2009 в 15:26.
BiT вне форума Ответить с цитированием
Старый 24.03.2009, 16:17   #74
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от BiT Посмотреть сообщение
У меня не получается сделать звук для входящего приватного сообщения тоесть незнаю как обработать события.

+Реализуйте бан пожалуйста!
Обратите внимание на процедуру приема команд клиента ClientSocketRead конкретно на структуру Case. Прием приватного сообщения отмечен в условии 3:. Там сейчас процедура вывода текста через ShowColorMassage, добавьте туда строчку с нужным событием, вот так:

Код:
procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
// получим текст, код комманды, длину строки 
  ...
// определение команд
  Case com of
// добавим в ChatRichEdit сообщение с сервера
    0: ...
// отошлем свой ник на сервер
    1: ...
// примем строку списка пользователей
    2: ...
// добавим в ChatRichEdit приватное сообщение с сервера
    3: Begin
          ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
         // тут строчка запуска звука  
        end;
   end;

  ...
end;
Реализовывать бан должны Вы, а я просто помогаю советом и кодом, если есть время. К слову, вот вам простой способ блокировки и разблокирования канала:
Код:
ServerSocket.Socket.Connections[i].Lock
ServerSocket.Socket.Connections[i].Unlock
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 24.03.2009, 22:23   #75
BiT
 
Аватар для BiT
 
Регистрация: 24.03.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
// добавим в ChatRichEdit приватное сообщение с сервера
3: Begin
ShowColorMassage(Copy(text,1,5)+Cop y(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
// тут строчка запуска звука
PlaySound('C:\sndRemSelf.wav',0,SND _ASYNC);
end;
end;

...
end;[/CODE]

Реализовывать бан должны Вы, а я просто помогаю советом и кодом, если есть время. К слову, вот вам простой способ блокировки и разблокирования канала:
Код:
ServerSocket.Socket.Connections[i].Lock
ServerSocket.Socket.Connections[i].Unlock


Спасибо большое помогло, А вот с банном не могу не как понять. У вас будет свободное время опишите, пожалуйста, поподробней.
BiT вне форума Ответить с цитированием
Старый 24.03.2009, 23:18   #76
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Можно сделать еще проще. Нужно вставить в таймер цикл перебирающий массив пользователей, и ищущий пометку бана (это запись в типе), как только пометка найдена, нужно пропускать канал.
Код:
procedure TForm1.ServerTimerTimer(Sender: TObject);
begin
// условие на наличие установленных каналов
  If ServerSocket.Socket.ActiveConnections<>0 then
    Begin
// цикл по существующим каналам
      For i:=1 to ServerSocket.Socket.ActiveConnections do
        Begin
          // все что ниже идет через проверку на бан
          ...
Определить номер канала в списке можно так:
Код:
UserListView.Selected.Index - 1;
// проверка, чтобы не был выделен сервер
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 25.03.2009, 15:27   #77
parinoff
 
Регистрация: 21.11.2008
Сообщений: 7
По умолчанию

Привет всем!

А подскажите почему вот так не отправляются сообщения?
Хочу сделать так чтобы был ник потом время написано, потом переход на следующую строку и само сообщение)

Код:
// отправляем приватное сообщение
              form1.ClientSocket.Socket.SendText('3'
                                           +'5'
                                           +'1'
                                           +'10'
                                           +PageControl1.ActivePage.Caption+Chr(152)
                                           +form3.NikEdit.Text
                                           +' ('+TimeToStr(Time)+')');


              form1.ClientSocket.Socket.SendText('3'
                                           +FontName
                                           +FontSize
                                           +FontColor
                                           +PageControl1.ActivePage.Caption+Chr(152)
                                           +memo.Text);
parinoff вне форума Ответить с цитированием
Старый 25.03.2009, 19:10   #78
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Что происходит если в один канал клиент без паузы шлет два пакета? ...они схлопываются в один, ...сервер ошибается, считая два пакета за один. Пакет отсылать нужно один раз, а как отобразить содержимое, подряд или с переходами, это уже вопросы к процедуре отображения:

Код:
procedure TForm1.ShowColorMassage(msg: String; index: Byte);
begin
// работаем с полем чата
  With ChatRichEdit do
    Begin
// переход на новую строку
      Lines.Add('');
// название шрифта, смотрим соответствие в списке
      SelAttributes.Name:=Form2.FontComboBox.Items.Strings[StrToInt(Copy(msg,2,1))];
// размер шрифта, смотрим соответствие в списке
      SelAttributes.Size:=StrToInt(Form2.SizeComboBox.Items.Strings[StrToInt(Copy(msg,3,1))]);
// цвет текста, смотрим соответствие в списке (не забываем про хитрость с десяткой)
      SelAttributes.Color:=Form2.ColorBox.Colors[StrToInt(Copy(msg,4,2))-10];
// условия применения стиля к тексту
      If index = 0 then SelAttributes.Style := [];        // обычный (сообщения)
      If index = 1 then SelAttributes.Style := [fsBold];  // полужирный (приват)
      If index = 2 then SelAttributes.Style := [fsItalic];  // курсив (системное)
      // стили можно комбинировать, указать их через запятую, или просто
      // оставить квадратные скобки пустыми
      // может быть 256 вариантов индекса сообщения (0 - 255), ...вольному - воля!
// добавляем текст сообщение в поле чата, только его содержательную часть
      SelText:=Copy(msg,6,Length(msg)-5);
    end;
end;
Думаю тут из комментариев понятно где что. Строчка SelText:=Copy(msg,6,Length(msg)-5); выводит в поле часть пакета, информативную, т.е. с 6-го байта начиная. Первые 5 байт - это заголовок пакета он обработан ранее. Так вот, что там с 6-го байта идет этой команде не важно, она лепит подряд. Если поменять местами время и ник, то ничего не произойдет, команда выдаст так как пришло в пакете. Но, как теперь определить ник там или нет? ...до какой позиции нужно на одной строке написать, и после какой позиции на второй? ...думайте. Ник приславшего - запись не статичная, количество символов варьируется, а время имеет статичный набор байт - 8.
Переход на строчку ниже это команда ChatRichEdit.Lines.Add('');.

Вы можете просто не отправлять ни время ни ник отправителя, только заголовок+приватный ник+текст, а ник отправившего брать из записей сервера по UserMas[i].Name и время местное TimeToStr(Time).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.04.2009, 23:11   #79
GIGOMAUNT
 
Аватар для GIGOMAUNT
 
Регистрация: 11.04.2009
Сообщений: 4
По умолчанию

Подскажите как отпровлять сообщение одному клиенту, а не рассылать всем подряд?
Жизнь игра но вот только конец у неё по любому GAME OVER, а так сыграть стоит!
GIGOMAUNT вне форума Ответить с цитированием
Старый 13.04.2009, 17:43   #80
GIGOMAUNT
 
Аватар для GIGOMAUNT
 
Регистрация: 11.04.2009
Сообщений: 4
По умолчанию

Цитата:
Сообщение от GIGOMAUNT Посмотреть сообщение
Подскажите как отпровлять сообщение одному клиенту, а не рассылать всем подряд?
Всё по этому вопросу определился сам! Но возник ещё один. Как мне определить с какого клиента пришло сообщение? Например так:
Клиент прислал на сервер: 'Mes Привет!!'
Соответственно сервер распознал от какого клиента пришло сообщение и только ему отправил в ответ: 'Mes Привет!'
Жизнь игра но вот только конец у неё по любому GAME OVER, а так сыграть стоит!
GIGOMAUNT вне форума Ответить с цитированием
Ответ


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