Сервер C ++ «HTTP» - передача данных по частям - PullRequest
1 голос
/ 11 ноября 2010

ОБНОВЛЕНИЕ : Спасибо за помощь. Я только что протестировал программу, подключающуюся к нему напрямую из браузера, а не через XMLHttpRequest. Переход прямо из браузера работает без нареканий.

Однако это соединение должно обрабатываться через XMLHTTPRequest. Согласно FireBug, он получает полный ответ (в данном случае 31 байт). Он закрывает соединение, устанавливает для readyState значение 4. Но responseText полностью пуст.


Я создаю приложение на C ++, которое принимает соединения и отвечает, как если бы это был HTTP-сервер. Моя цель - создать сервер чата в реальном времени, открыв подключения к этому приложению C ++ и ответив «страницей», которая продолжает загружаться при отправке новых сообщений. В настоящее время я отправляю следующее:

HTTP / 1.1 200 OK \ r \ n
Кодирование передачи: chunked \ r \ n
Тип содержимого: текст / обычный \ r \ n
\ Г \ п

До этого момента все работало. Используя FireBug, я вижу, что он правильно получает и интерпретирует заголовки. Однако я не могу понять, как переслать текст ответа. Я знаю, что в простом тексте это будет выглядеть следующим образом:

5
Hello
8 * * тысяча двадцать-один До свидания

Но каждая итерация, которую я пробовал (с \ r \ n, без \ r \ n, считая \ r \ n как 2 дополнительных байта), до сих пор не читается браузером как текст ответа. Может кто-нибудь помочь с созданием правильной строки для отправки в качестве текста ответа?

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Вы пытаетесь реализовать "HTTP Push" или потоковую передачу HTTP или что-то еще, проблема в том, что не все браузеры будут поддерживать это правильно, для браузеров, таких как firefox / opera и т. Д., Вы можете попробовать mime-type multipart/x-mixed-replace , так что пока вы поддерживаете соединение и отправляете что-то вниз, firefox должен читать, но это не будет работать в IE ...

1 голос
/ 11 ноября 2010

Вы должны завершить передачу фрагментом нулевой длины:

5
Hello
8
Good bye
0

В противном случае браузер не узнает, что вы закончили.

0 голосов
/ 11 ноября 2010

«Каждый фрагмент начинается с числа октетов данных, которые он встраивает, выраженных в шестнадцатеричном формате, за которыми следуют необязательные параметры (расширение фрагмента) и завершающая последовательность CRLF (возврат каретки и перевод строки), за которой следуют данные фрагмента»

Используете ли вы гекс для своих длин?\ R \ n после длины фрагмента не должны учитываться в длине.

Кроме того, попробуйте закрыть страницу с длиной 0.Это даст вам знать, что браузер просто выполняет буферизацию перед анализом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...