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

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

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

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

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

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

Опишите словесно, что вы хотите сделать. По видимому вход по паролю на сервер. Ошибки у вас в процедурах, в какой именно можно узнать, заключив вызов процедуры в структуру Try..Except..End;

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
  var i:integer;
begin
  if ServerSocket1.Socket.ActiveConnections<>0 then
    begin
      // цикл по существующим каналам
      for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
        begin
          // сохраним пакет (если ничего не прислали, по пакет пустой)
          buf:=ServerSocket1.Socket.Connections[i].ReceiveText();
          // условие, что пакет не пуст
          if text<>'' then
            begin
               Try DivStr(pas,buf) Except LabelError.Caption:='Ошибка DivStr' end;
               Try GetCode(pas,buf) Except LabelError.Caption:='Ошибка GetCode' end;
               ServerSocket1.Socket.Connections[i].SendText(buf);
            end;
        end;
    end;
LabelError создайте на форме, чтобы видеть, какая из процедур неверно себя ведет.
Вообще, тяжело разбираться с простыми вырезками кода, без пояснений. Логически процедуры уже себя некорректно ведут в общем коде чата. А если вы пишете заново самостоятельно, то у вас уже все с кодировкой пакета видимо изменено. Покажите свою структуру, тогда смогу помочь.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.12.2009, 17:50   #302
ManU
Пользователь Подтвердите свой е-майл
 
Аватар для ManU
 
Регистрация: 30.04.2008
Сообщений: 78
По умолчанию

Ну мне нужно что бы клиент передавал на сервер пароль и текст.
А сервер ему в ответ присылал зашифрованный текст. Должна быть поддержка нескольких клиентов.
Код:
procedure DivStr(var password:string;var text:string );
var i:integer;
begin
 i:=1;
 repeat
  inc(i);
 until text[i+1]=' ';//ошибку выдает здесь но ведь при 
//подключении клиента, когда данные не отправлены процедура выполняться не должна
 password:=copy(text,1,i);
 delete(text,1,i+1);
end;
Вот исходники.
Вложения
Тип файла: rar курс.rar (15.1 Кб, 39 просмотров)

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

В исходном варианте, после коннекта клиента, сервер шлет запрос на ник по коду "1", клиент тут же отвечает пакетом "1+никнейм", после получения этого пакета, сервер готовит список пользователей и отправляет по коду "2+список", ...все, наступает молчание, сервер ждет от клиентов пакетов с текстом.
Вам следует вместе с никнеймом отсылать и пароль: "1+никнейм+пароль", примените разделитель, символ, который с клавиатуры нельзя ввести, например Chr(152); Сервер приняв пакет, в том же кейсе на пункт 1: запишет никнейм, запишет в переменную пароль, посмотрит файл паролей, если и никнейм и пароль совпадут, только тогда последует формирование списка и его отправка, в противном случае соединение разорвется: ServerSocket.Socket.Connections[i].Close;
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 14.12.2009, 16:48   #304
ManU
Пользователь Подтвердите свой е-майл
 
Аватар для ManU
 
Регистрация: 30.04.2008
Сообщений: 78
По умолчанию

Нашел ошибку
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
if ServerSocket1.Socket.ActiveConnections<>0 then
// цикл по существующим каналам
for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
begin
// сохраним пакет (если ничего не прислали, по пакет пустой)
buf:=ServerSocket1.Socket.Connections[i].ReceiveText();
// условие, что пакет не пуст
if text<>'' then //вот ошибка пакет сохраняю 
 //в buf а проверяю text
begin
DivStr(pas,buf);
GetCode(pas,buf);
ServerSocket1.Socket.Connections[i].SendText(buf);

end;
end;
end;
ManU вне форума Ответить с цитированием
Старый 13.02.2010, 04:37   #305
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Цитата:
..., статусы, в смысле "отошел", "занят", "не беспокоить", "готов поболтать" и пр.? ...если так, то вводите еще одну команду, в пакете код состояния.
Beermonza помоги..
Вопщем кинул на форму StatusComboBox в FormCreate добавил
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  StatusComboBox.Text := 'Гп';
  StatusComboBox.Items.Add('Status 1');
  StatusComboBox.Items.Add('Status 2');
  StatusComboBox.Items.Add('Status 3');
  StatusComboBox.Items.Add('Status 4');
  StatusComboBox.Items.Add('Status 5');
end;
вот так посылаю серверу и клиенту результаты
Код:
procedure TForm1.StatusComboBoxChange(Sender: TObject);
var
  StatusBox: string;
begin
StatusBox := IntToStr(StatusComboBox.ItemIndex);
//If ServerSocket.Active = True then
//For i := 0 to ServerSocket.Socket.ActiveConnections -1 do
//ServerSocket.Socket.Connections[i].SendText('0['+TimeToStr(Time)+']  //'+Setting.NickEdit.Text+':  '+TextEdit.Text)
//else
ClientSocket.Socket.SendText('0['+TimeToStr(Time)+']  '+StatusBox);
ChatRzRichEdit.Lines.Add('['+TimeToStr(Time)+']  '+StatusBox);
end;
вот незнаю как сделать чтобы статус добавлялся в UserListView (в виде картинки например) и обновлялся у других пользователей чата.
mishqa35 вне форума Ответить с цитированием
Старый 16.02.2010, 17:40   #306
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Сначала нужно разобраться со структурой и кодировкой пакетов. Вот такая система сейчас в чате:

Код:
// определение комманд у клиента
  Case com of
    0: // сообщение с сервера
    1: // отошлем свой ник на сервер
    2: // примем строку списка пользователей
    3: // приватное сообщение с сервера
  end;

// определение команд у сервера
  Case com of
    0: // прием сообщения
    1: // авторизация (клиент прислал ник)
    3: // прием приватного сообщения
  end;
У клиента пакет команды 2 является системным, сервер его посылает в одну сторону, чтобы передать параметры общения, а конкретно - список пользователей.
Вам нужно ввести еще одну команду. Пусть ее код в заголовке будет 4, тогда вы смело составляете пакет вот так:
Код:
ClientSocket.Socket.SendText('4'+StatusBox);
Сервер должен реагировать на код 4 как "отослать всем статус пользователя". Как собрать такой пакет, чтобы он был именован? ...давайте логически подумаем. Первый байт - это код пакета, он у нас 4. Статус - это 1 байт как не крути, пустим его следом, и в хвосте можно выдернуть из списка пользователей его ник - UserMas[i].Name. Получается, приняв пакет из 2-х байт, сервер приписывает в конец этого пакета ник приславшего:
Код:
// разошлем сообщение пользователям (кроме того, кто прислал)
  For j:=0 to ServerSocket.Socket.ActiveConnections-1 do
    Begin
        If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText(text+UserMas[i].Name);
     end;
Клиент должен реагировать на такой пакет следующим образом. В Case пойдет пункт 4: , в нем забираем 2-й байт как статус, и остальное, начиная с 3-го символа и до конца, ищем в списке пользователей UserListView.Items.Item[j].Caption совпадение, естественно, через цикл от 0 до Count-1. Найдя ник, меняем картинку UserListView.Items.Item[j].ImageIndex.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 16.02.2010 в 17:49.
Beermonza вне форума Ответить с цитированием
Старый 17.02.2010, 02:42   #307
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

не получается
делаю так...
сюда добавляем
Код:
procedure TForm1.ClientSocketRead...
после
Код:
    3: ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
вот это
Код:
    4: ClientSocket.Socket.SendText('4'+StatusBox);
Далее
в
Код:
procedure TForm1.ServerTimerTimer..
после
Код:
3: Begin
 { много кода.. }
end;
вот это
Код:
4: Begin
 { незнаю даже }
 { находим ник того кто изменил статус и меняем картинку.. }
 UserListView.Items.Item[j].ImageIndex := ??;
end;
Крутил по разному но не вышло.
ps; в delphi недавно
mishqa35 вне форума Ответить с цитированием
Старый 17.02.2010, 17:38   #308
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

mishqa35, внимательнее, ... ClientSocketRead событие клиентского сокета, в Case в пункте 4 не может быть ClientSocket.Socket.SendText('4'+St atusBox);, ибо это запрос на перевод статуса, отсылаемый клиентом. Эту команду вешаем на кнопку "сменить статус", или на OnChange вашего StatusComboBox. В Case здесь в пункте 4 нужен алгоритм:
Цитата:
Сообщение от Beermonza
В Case пойдет пункт 4: , в нем забираем 2-й байт как статус, и остальное, начиная с 3-го символа и до конца, ищем в списке пользователей UserListView.Items.Item[j].Caption совпадение, естественно, через цикл от 0 до Count-1. Найдя ник, меняем картинку UserListView.Items.Item[j].ImageIndex.
Что значит это? ...нужен цикл, перебирающий все записи в UserListView. Создайте его по j от 0 до UserListView.Items.Count-1. В нем забирайте ник с пакета (Copy(text,3,Length-2)), сканируйте в списке Caption (там содержится ник пользователей): UserListView.Items.Item[j].Caption; ...не просто так сканируйте, а при условии, условие это If..then..else..end. Задача: если сканирование нашло совпадение, тогда -сменить значок (UserListView.Items.Item[j].ImageIndex), какое значение придать? ...нужно сперва добавить картинки в ImageList1, знать порядковый номер картинки, да так, чтобы номера картинок в банке совпадали номерам записей в StatusComboBox. Для начала можно обойтись и без смены картинок, а просто сделать Label в котором будет отображаться номер статуса. В этом случае вместо UserListView.Items.Item[j].ImageIndex будет StatusLabel.Caption := Copy(text,2,1); ...это копирование 2-го символа пакета, он отвечает за статус. Ваш StatusLabel будет как проверка, один на всех, но можно увидеть, работает код или нет. Далее нужно заниматься с банком картинок (изучайте компонент TImageList).

Аналогично, ServerTimerTimer процедура серверного сокета, ...в Case в пункте 4:
Цитата:
Сообщение от Beermonza
Сервер должен реагировать на код 4 как "отослать всем статус пользователя". Как собрать такой пакет, чтобы он был именован? ...давайте логически подумаем. Первый байт - это код пакета, он у нас 4. Статус - это 1 байт как не крути, пустим его следом, и в хвосте можно выдернуть из списка пользователей его ник - UserMas[i].Name. Получается, приняв пакет из 2-х байт, сервер приписывает в конец этого пакета ник приславшего:

Код:
// разошлем сообщение пользователям (кроме того, кто прислал)
  For j:=0 to ServerSocket.Socket.ActiveConnections-1 do
    Begin
        If (j+1) <> i then ServerSocket.Socket.Connections[j].SendText(text+UserMas[i].Name);
     end;
...все как есть в Case в пункт 4.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 17.02.2010 в 17:45.
Beermonza вне форума Ответить с цитированием
Старый 21.02.2010, 16:53   #309
mishqa35
Пользователь
 
Регистрация: 01.10.2009
Сообщений: 10
По умолчанию

Спасибо Beermonza, буду пробывать..
Еще интересует вопрос воп при получении собобщения в чат, меняется Caption формы.. как это убрать?
mishqa35 вне форума Ответить с цитированием
Старый 21.02.2010, 17:10   #310
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

В конце событий сокетов на прием пакетов запишите выправление заголовка: Form1.Caption := {текст};
Руководитель проекта 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