Форум: "Прочее";
Текущий архив: 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