Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
15-1392150605
Юрий
2014-02-12 00:30
2014.09.14
С днем рождения ! 12 февраля 2014 среда


2-1381834603
v1.0
2013-10-15 14:56
2014.09.14
множество


15-1391718602
Юрий
2014-02-07 00:30
2014.09.14
С днем рождения ! 7 февраля 2014 пятница


11-1254087305
intlex
2009-09-28 01:35
2014.09.14
Creation Order (Порядок создания компонентов)


15-1390565775
DevilDevil
2014-01-24 16:16
2014.09.14
Разбираемся в кодировках





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский