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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 20:58   #611
Dreykot
 
Регистрация: 30.01.2011
Сообщений: 3
По умолчанию

Спасибо за оперативный ответ, к сожалению, это проблему не решает.
Уже проверял различные варианты.
Даже написал простенькую программу которая при нажатии кнопок в Memo (с разными настройками Charset) выводит текст и дал на тестирование, текст отображается корректно при различных комбинациях.
Более того, добавил в программу дополнительную кнопку "проверка" которая выводит в окно чата русские слова и это работает.
Но при оправке сообщения возникает та же проблема.
Такое чувство, что при передаче, программа меняет кодировку.

Последний раз редактировалось Dreykot; 30.01.2011 в 21:03.
Dreykot вне форума Ответить с цитированием
Старый 31.01.2011, 21:08   #612
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Можно попробовать поискать разновидности традиционного тип String, наверняка есть учитывающие кодировку.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 31.01.2011, 21:35   #613
Dreykot
 
Регистрация: 30.01.2011
Сообщений: 3
По умолчанию

Тоже обратил внимание на string.
Попробую реализовать отправку сообщений в различных кодировках, как это сделано в большинстве icq клиентов.
При успешной реализации отпишусь.
Dreykot вне форума Ответить с цитированием
Старый 05.03.2011, 20:45   #614
vanois
Новичок
Джуниор
 
Регистрация: 07.09.2010
Сообщений: 1
По умолчанию

Извиняюсь, если это уже было, но вопрос такой: почему чат, откомпиленный на 7й дельфе, прекрасно пашет, а откомпиленный в 2010 выбивает на глюки в виде кракозяблов вместо имени юзера и сообщений. В существенных поправок не вводилось. Дело чисто в кодировке или ещё что-то?
vanois вне форума Ответить с цитированием
Старый 07.03.2011, 00:30   #615
Zhanibek
Новичок
Джуниор
 
Регистрация: 23.12.2009
Сообщений: 1
По умолчанию

Здравствуйте!
Помогите пожалуйста у меня приватное сообщение показывает в новом заранее созданном форме в Memo, и еще кнопки «ответить» и «закрыть». Как сделать несколько таких форм с такими же событиями на кнопках?
Form2.Caption:= 'Личное сообщение от '+ххх;
Form2.Memo1.Text:= Text;
Form2.ShowModal;

procedure TForm2.Button2Click(Sender: TObject);
begin
...
Form2.Close;
...
end;
Zhanibek вне форума Ответить с цитированием
Старый 09.03.2011, 14:59   #616
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от vanois Посмотреть сообщение
Извиняюсь, если это уже было, но вопрос такой: почему чат, откомпиленный на 7й дельфе, прекрасно пашет, а откомпиленный в 2010 выбивает на глюки в виде кракозяблов вместо имени юзера и сообщений. В существенных поправок не вводилось. Дело чисто в кодировке или ещё что-то?
Дело в формате хранения строковых данных String. Очевидно последние версии Delphi считают "по-умолчанию" кодировку в Unicode. Вам нужно поискать в Интернете таблицу синхронизации типов данных на обе версии среды, с тех пор много чего изменилось.

Цитата:
Сообщение от Zhanibek
Помогите пожалуйста у меня приватное сообщение показывает в новом заранее созданном форме в Memo, и еще кнопки «ответить» и «закрыть». Как сделать несколько таких форм с такими же событиями на кнопках?
Вы не знаете как добавить в проект форму(ы) или что? ...не совсем понятен вопрос, поскольку в нем уже половина ответа, ...уточните пожалуйста.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 17.05.2011, 22:19   #617
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

Beermonza
Не мог бы ты подсказать как можно в твоем чате организовать передачу шифрованных сообщений. Суть в том что зашифровать их получается, а вот реализовать разшифровку неочень, можешь подсказать где надо вставлять процедуру разшифровки в твоем коде как для клиента так и для сервера.
Вот мои функции шифрования :
Цитата:
function EncodeBase64(Value: String): String;
const
b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh ijklmnopqrstuvwxyz0123456789+/';
pad: PChar = '====';

function EncodeChunk(const Chunk: String): String;
var
W: LongWord;
p, n: Byte;
begin
n := Length(Chunk); W := 0;
for p:= 0 to n - 1 do
W := W + Ord(Chunk[p + 1]) shl ((2 - p) * 8);
Result := b64alphabet[(W shr 18) and $3f] +
b64alphabet[(W shr 12) and $3f] +
b64alphabet[(W shr 06) and $3f] +
b64alphabet[(W shr 00) and $3f];
if n <> 3 then
Result := Copy(Result, 0, n + 1) + Copy(pad, 0, 3 - n); //add padding when out len isn't 24 bits
end;

begin
Result := '';
while Length(Value) > 0 do
begin
Result := Result + EncodeChunk(Copy(Value, 0, 3));
Delete(Value, 1, 3);
end;
end;


function DecodeBase64(Value: String): String;
const b64alphabet: PChar = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh ijklmnopqrstuvwxyz0123456789+/';
function DecodeChunk(const Chunk: String): String;
var
W: LongWord;
p: Byte;
begin
W := 0; Result := '';
for p:= 1 to 4 do
if Pos(Chunk[p], b64alphabet) <> 0 then
W := W + Word((Pos(Chunk[p], b64alphabet) - 1)) shl ((4 - p) * 6);
for p:= 1 to 3 do
Result := Result + Chr(W shr ((3 - p) * 8) and $ff);
end;
begin
Result := '';
if Length(Value) mod 4 <> 0 then Exit;
while Length(Value) > 0 do
begin
Result := Result + DecodeChunk(Copy(Value, 0, 4));
Delete(Value, 1, 4);
end;
end;
Еще перед тем как вставлять процедуру шифрования, я объявил глобально переменную [strtmp:string;.
Вот отрывой как я шифрую передачу сообщений с сервера на клиент:
Код:
procedure TForm4.SendBtnClick(Sender: TObject);
    Begin
// если сообщение для всех
      If PrivateEdit.Text='Всем' then
        Begin
        strtmp:= EncodeBase64(TxtEdit.Text);
// отправляем сообщение с сервера всем пользователям
          For a:=0 to ServerSocket1.Socket.ActiveConnections-1 do
          ServerSocket1.Socket.Connections[a].SendText('0['+TimeToStr(Time)+']  '+Niks+':  '+strtmp);
// отобразим сообщение в ChatMemo
          ChatMemo1.Lines.Add('['+TimeToStr(Time)+']  '+Niks+':  '+TxtEdit.Text);
           TxtEdit.Clear;

        end
      else
       Begin
// если выбран свой ник
          If PrivateEdit.Text<>Niks then
            {Begin
              ChatMemo1.Lines.Add('['+TimeToStr(Time)+']  '+Niks+':  '+TxtEdit.Text);
           end
          else  }
            Begin
// создаем цикл поиска приватного пользователя
              For a:=0 to ServerSocket1.Socket.ActiveConnections-1 do
                Begin
// если пользователь найден
                  If UserMas[a+1].Name=PrivateEdit.Text then
                    Begin
// отсылаем сообщение в канал приватного пользователя
                      strtmp:= EncodeBase64(TxtEdit.Text);
                      ServerSocket1.Socket.Connections[a].SendText('0['+TimeToStr(Time)+']  '+Niks+':  '+strtmp);
  // отобразим сообщение в ChatMemo
                      ChatMemo1.Lines.Add('['+TimeToStr(Time)+']  '+Niks+':  '+TxtEdit.Text);
                      TxtEdit.Clear;
// сбрасываем цикл
                     break;
                    end;  
                end;
            end;
        end;

end;
Так же поступаю и с клиентом. И все хорошо, оно шифрует сообщени яи пересылает, но вот с реализацией дешифровки не особо получается. Будь так любезен укажи места в коде где нужно вставлять дешифровку.
Буду очень признателен!
darek13 вне форума Ответить с цитированием
Старый 22.05.2011, 18:55   #618
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

darek13, как я понял, шифрование нужно чтобы никто не перехватил пакет сторонней программой, а если программа перехвата - взломанный клиент этого чата, то смысла в шифровке нет. Шифрование (хеширование) нужно для логина, пароля и приватных сообщений.

Допустим мы делаем защиту от дилетанта. Здесь нужно просто создать таблицы подмены для символов, которые будут спрятаны в клиенте и сервере. Нужно десяток таблиц - одномерных массивов, в каждой ячейке которой прописан код какого-нибудь символа, причем так чтобы он не повторялся в других ячейках. Любой пакет приватного сообщения будет содержать в своем ключе байт, отвечающий за кодировку. Клиент сам шифрует сообщение, указывает номер таблицы в ключ и отсылает. Сервер передает по назначению, и адресат читая ключ пакета узнает по какой таблице нужно расшифровывать сообщение.

Техническая сторона простая совсем. Принятая строчка отправляется в цикл по числу символов. По указанному массиву каждый байт принятой строки указывает на конкретную ячейку, а в ячейке содержится истинный код символа, берем Chr и добавляем к расшифрованной строке, символ за символом.

Лучше создавать парные таблицы подмены, на шифровку и расшифровку чтобы не тратить время на перебор ячеек таблицы в поисках номера подмены.

Все.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.05.2011, 19:39   #619
darek13
Пользователь
 
Аватар для darek13
 
Регистрация: 27.04.2011
Сообщений: 68
По умолчанию

это конечно все забавно, но мне так реализовать не надо, у меня кстати разбит клиент сервер, просто я хочу реализавать два алгоримта для шифровки/разшифровки, через компонент МД5 и потом зашифрованный текс моим алгоритмом, но я не могу понять где именно надо писать процедуру для разшифровки в твоем коде, я как не пытался реализовать. то при передачи сообщений они просто наченают пропадать
darek13 вне форума Ответить с цитированием
Старый 23.05.2011, 15:43   #620
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от darek13 Посмотреть сообщение
это конечно все забавно, но мне так реализовать не надо, у меня кстати разбит клиент сервер, просто я хочу реализавать два алгоримта для шифровки/разшифровки, через компонент МД5 и потом зашифрованный текс моим алгоритмом, но я не могу понять где именно надо писать процедуру для разшифровки в твоем коде, я как не пытался реализовать. то при передачи сообщений они просто наченают пропадать
Если сервер отдельный, то шифрование/расшифровывание в клиентской части на передачу и прием сообщений. Вот в отправке:

Код:
procedure TForm1.SendBtnClick(Sender: TObject);
begin
// проверка, в каком режиме находится программа
  If ServerSocket.Active=True then
    Begin

      // отправка с сервера

    end

  else

// отправляем сообщение с клиента
    Begin
// если сообщение для всех
      If PrivateEdit.Text='Всем' then
        Begin
// отправляем сообщение для всех
          strtmp:= EncodeBase64(TxtEdit.Text);
          ClientSocket.Socket.SendText('0'
                                       +FontName
                                       +FontSize
                                       +FontColor
                                       +'['+TimeToStr(Time)
                                       +']  '+NikEdit.Text
                                       +':  '+strtmp);
// отобразим сообщение в ChatRichEdit
          ...

        end
      else
        Begin
// если выбран не свой ник
          If PrivateEdit.Text<>NikEdit.Text then
            Begin
// отправляем приватное сообщение
              strtmp:= EncodeBase64(TxtEdit.Text);
              ClientSocket.Socket.SendText('3'
                                           +FontName
                                           +FontSize
                                           +FontColor
                                           +PrivateEdit.Text+Chr(152)
                                           +'>> ['+TimeToStr(Time)
                                           +']  '+NikEdit.Text
                                           +':  '+strtmp);
// отобразим сообщение в ChatRichEdit что кому-то отправлено приватное сообщение
              ...

            end;
// если выбран свой ник
          If PrivateEdit.Text=NikEdit.Text then
            Begin
// отобразим сообщение в ChatRichEdit что приватное сообщение для себя (бред какой-то :))
              ...
            end;
        end;
    end;
// очищаем TextEdit
  TextEdit.Clear;
end;
На прием:

Код:
procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin

// получим текст, код комманды, длину строки
  text:=Socket.ReceiveText();
  com:=StrToInt(Copy(text,1,1));
  len:=Length(text)-1;


   тут декодировать сообщение и результат отправлять на отображение 


// определение комманд
  Case com of
// добавим в ChatRichEdit сообщение с сервера
    0: ShowColorMassage(text, 0);
// отошлем свой ник на сервер
    1: ClientSocket.Socket.SendText('1'+NikEdit.Text);
// примем строку списка пользователей
    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;
// добавим в ChatRichEdit приватное сообщение с сервера
    3: ShowColorMassage(Copy(text,1,5)+Copy(text,7+Length(NikEdit.Text),len-Length(NikEdit.Text)-1), 1);
   end;
// восстанавливаем заголовок формы
  Form1.Caption:='BZChat: v2.0';
end;
Сервер ничего в этом случае не производит, ему без разницы какой набор символов передать в указанный приватный канал и вообще.
Руководитель проекта 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