Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.14;
Скачать: CL | DM;

Вниз

WebSocket/ Хочу перепилить idHttpServer или что другое   Найти похожие ветки 

 
ВладОшин ©   (2014-01-23 13:51) [0]

что бы реализовать такое в своей программе (сервер для клиентов внутри локалки).
По прочтению о WebSocket - оно мне, похоже, и надо .
1. Кто-то делал?
2. Кто-то сделал? :)
3. Кто сделал(делал) - поделится? (тем что есть)


 
ВладОшин ©   (2014-01-23 13:53) [1]

зы,
Delphi- only, конечно


 
DVM ©   (2014-01-23 13:56) [2]

Я где то раньше видел класс-наследник для TidHTTP поищи в гугле может найдешь.


 
Eraser ©   (2014-01-23 14:27) [3]


> ВладОшин ©   (23.01.14 13:51) 

года 2 назад в сети была реализация веб-сокетов на делфи, можно взять за основу. может сейчас наработок больше.


 
[ВладОшин] ©   (2014-01-23 23:10) [4]

нахожу..

судя по
http://ru.wikipedia.org/wiki/WebSocket
там вообще, ерунда должна быть..

Они же все (найденные) какие-то библиотеки тянут, То инди не такая, то ICS поставь, то RO какие-то, то не ниже d7 надо (у меня d6 :), ну не купила контора выше ничего :))

Взял простой TTcpServer.
Запрос получаю. Смотрю заголовки. Как только  
Pos("Sec-WebSocket-Key:", SL[i]) <> 0
наш заголовок
Тогда отдаю, что IE ждет - ClientSocket.SendBuf(
(Но, где то ошибаюсь, похоже.. :) )
IE говорит, ты дурак и OnClose в JS срабатывает.
т.е. первый же ответ неправильно формирую..

Ну а так - то, один раз ответить правильно и соединение будет установлено, дальше хоть что гони туда-сюда
, так ведь?
Нафиг все эти over 100500 библиотек..
Или что-то не понимаю?..


 
Eraser ©   (2014-01-23 23:19) [5]

Протокол 07.


 
[ВладОшин] ©   (2014-01-26 22:03) [6]

что-то не получается свистнуть

приходит:
KEY: dGhlIHNhbXBsZSBub25jZQ==

Дополняю константой
ADD: dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

Вычисляю sha1
SHA: b37a4f2cc0624f1690f64606cf385945b2bec4ea
проверяю тут: http://www.sha1-online.com - совпадает

Как они из этого через base64 получили
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
не понимаю

У меня по-другому получается. Сам не ломал голову, скопипастил с torry
const
 Codes64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";

function Encode64(S: string): string;
var
 i: Integer;
 a: Integer;
 x: Integer;
 b: Integer;
begin
 Result := "";
 a := 0;
 b := 0;
 for i := 1 to Length(s) do
 begin
   x := Ord(s[i]);
   b := b * 256 + x;
   a := a + 8;
   while a >= 6 do
   begin
     a := a - 6;
     x := b div (1 shl a);
     b := b mod (1 shl a);
     Result := Result + Codes64[x + 1];
   end;
 end;
 if a > 0 then
 begin
   x := b shl (6 - a);
   Result := Result + Codes64[x + 1];
 end;
end;

туда: http://base64.ru/
и так вставлял,  b37a4...
и Chr(b3) + Chr(7a) ...

как они получили то?!
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=


 
[ВладОшин] ©   (2014-01-26 22:29) [7]

кратко:

 SpecifcationGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
 FullWebSocketKey = concatenate(Sec-WebSocket-Key, SpecifcationGUID);
   // dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
ok :)

 KeyHash = SHA-1(FullWebSocketKey);
   // 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea
ok

 Sec-Websocket-Accept = base64(KeyHash);
   // s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
не получается

или
если как текст понимать, будет YjM3YTRmMmNjMDYyNGYxNjkwZjY0NjA2Y2YzODU5NDViMmJlYzRlYQ==
(как и тут http://base64online.org/encode/)

или, если как код символов,
0ZZ6TyzQkGJPFtGS0YZGBtCfOFlF0IbRldCU0Lo=
(так нигде не видел. Потому что ерунда, похоже. Но проверить надо)


 
[ВладОшин] ©   (2014-01-26 23:32) [8]

снимается,

> 0ZZ6TyzQkGJPFtGS0YZGBtCfOFlF0IbRldCU0Lo=
> (так нигде не видел. Потому что ерунда, похоже. Но проверить
> надо)

именно так и надо :), только ошибся в позиции. Ответ считает правильно.
тут ясно,
а вобще - еще менее ясно стало.
Цепляюсь страничкой к одному серверу - все нормально. К своему - соединение не установлено. С/на клиента (по F12->сеть) видно, что приходит одно и тоже(за исключением ключей, понятно), вроде бы.. Какого ж рожна ему теперь надо..


 
[ВладОшин] ©   (2014-01-27 00:29) [9]

Отладчик JS говорит, что соединение устанавливается в обоих случаях.
Но в моем -  тут же рвется. Хм..


 
Cobalt ©   (2014-01-27 14:06) [10]

keep-alive?


 
Eraser ©   (2014-01-27 14:37) [11]


> [ВладОшин] ©   (26.01.14 22:03) [6]

пример кодироващика можно взять в Indy, а можно прям его и использовать.


 
[ВладОшин] ©   (2014-01-29 07:44) [12]

С кодированием проблем уже нет. Все браузеры понимают рукопожатие. Перестают понимать передачу.
Взять готовое - не спортивно :)


> keep-alive?

не думаю,
обмен с работающими примерами (только exe скачал) такими же заголовками плюется
что-то я в дальнейшем обмене не так сделал

Соединение установлено, отправляю из браузера "1" - получаю какую то фигню.
так: #0 ..UTF8.. #255 - не подходит
Там что-то по маскам-фреймам как-то еще бить надо, судя по rfc..
Да все некогда было разобраться.. Может, на неделе продолжу :)


 
ВладОшин ©   (2014-02-03 17:06) [13]

а я побеждаю :)
примерно со счетом 5:2 и осталось играть еще немного
гол мне забили за тупость, и второй - за странную логику инди (/ или тупость2) :)

по проблеме разрывов - отвечал немного раньше, чем браузер этого ждал
он еще два #13#10 досылал, а я ему уже ответ

осталось дожать с обменом. Потому как нифига не #00_UTF8_#FF. походу идет

зы
сделал проксик м/д работающим сервером(exe) из примера где денег хотят и страницей. Настроил их на этот прокси, и вывожу то, что посчитал сам  параллельно с тем, чем они обмениваются. :)


 
ВладОшин ©   (2014-02-04 16:52) [14]

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

отправлять можно так
var B: TIdBytes;
begin
 SetLength(B, 3);
 B[0] := 129;  B[1] := 1;  B[2] := 49;
 и Context.Connection.IOHandler.Write(B,3);

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


 
Eraser ©   (2014-02-04 17:24) [15]


> ВладОшин ©   (04.02.14 16:52) [14]

да, строки лучше отправлять вручную (через массив байт), а не стандартными способами компонента, т.к. таки перекодирует.


 
[ВладОшин] ©   (2014-02-09 13:29) [16]

добил. Заканчиваю тему, вдруг кому пригодится:
формат текстового однофреймового сообщения такой

All - весь массив пришедших байт

First := All[0]; байт заголовка
старший бит = 1 - последний фрейм. Только такие рассматриваем.
следующие 3 бита =0, резерв
следующие 4 - тип фрейма. 0001 - текст.Только такие рассматриваем.

Second := All[1];
старший бит = 1 - зашифровано. Только такие браузер шлет. Сервер может ставить в 0 и слать прямым текстом
следующие 7 бит - длина фрейма (LLL)

следующие 4 байта - маска, тупо случайные байты

следующие до конца  (= (LLL) ) байты данных
интерпретируются как xor по кругу с маской

реализация:

CopyMemory(@Mask[0], @All[2], 4);
SetLength(Data, n - 6);
CopyMemory(@Data[0], @All[6], n - 6);
FCLMsg := "";
for i := 0 to Length(Data) - 1 do
 FCLMsg := FCLMsg + Chr( Data[i] xor Mask[i mod 4] ); //интерпретируются как xor по кругу с маской

if Assigned( FOnClientMessage ) then
 FOnClientMessage(Self, FCLMsg);


 
Плохиш ©   (2014-02-09 15:24) [17]

WebServices для обмена между приложениями.
WebSnap для обмена с браузерами.



Страницы: 1 вся ветка

Текущий архив: 2014.09.14;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
15-1391977802
Юрий
2014-02-10 00:30
2014.09.14
С днем рождения ! 10 февраля 2014 понедельник


2-1381158756
OlegSkal
2013-10-07 19:12
2014.09.14
XE5 Win32 Android Viewport3D Layer3D искажение размеров


2-1381816621
aka
2013-10-15 09:57
2014.09.14
JSON русские символы


15-1391632202
Юрий
2014-02-06 00:30
2014.09.14
С днем рождения ! 6 февраля 2014 четверг


15-1392191970
Пятница 13
2014-02-12 11:59
2014.09.14
Delphi + NEXTGEN (LLVM) = крах!