Отправка сжатых данных через сокет - PullRequest
1 голос
/ 16 июня 2010

Я должен сделать сервер журналов в Java, и одна задача - отправить сжатые данные.Теперь я отправляю это построчно в виде простого текста, но я должен сжать его.Сервер обрабатывает запрос «как HTTP».Например, я могу получить журнал отправки "GET xxx.log".Это установит TCP-соединение с сервером, ответ сервера с заголовком и журналом и закроет соединение.Клиент читает построчно и анализирует каждую запись в журнале.Я попробовал несколько способов без успеха.Моя главная проблема в том, что я не знаю, где заканчивается каждая строка (в размере клиента).Есть идеи?

Ответы [ 3 ]

3 голосов
/ 16 июня 2010

Используйте GZIPOutputStream на сервере и GZIPInputStream на клиенте, с InputStreamReader вокруг этого и BufferedReader вокруг этого. Тогда просто читайте строки.

1 голос
/ 16 июня 2010

Вещь, которая имеет больше всего смысла, это что-то вроде этого

  1. Клиент отправляет GET foo.log
  2. Сервер отправляет "Размер: 15042 \ n"
  3. Сервер отправляет сжатый файл журнала, всего
  4. Клиент анализирует заголовок Size: (читает до новой строки) и затем знает, сколько байтов ожидать
  5. Затем клиент считывает все эти байты с сервера (в примере 15042)
  6. Клиент распаковывает полученные данные
  7. Клиент затем обрабатывает журнал (распакованный вы найдете новые строки)
0 голосов
/ 16 июня 2010

Вы можете взглянуть на заголовок HTTP Range. Клиент может запросить диапазон байтов, а сервер вернет только эти байты. Используйте сжатие GZIP.

У вас может быть действие, которое вы вызываете от клиента, который предоставит индекс с байтовыми диапазонами до запроса части журнала.

С заголовками HTTP связано много накладных расходов, поэтому вы можете рассмотреть возможность отправки 100 строк за раз или более.

Наконец, рассмотрим кодирование передачи по частям, которое позволит вам передавать данные клиенту.

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