Двоичный файл против Передача строк по потоку

#java #string #binary #websocket #file-transfer

#java #строка #двоичный #websocket #передача файлов

Вопрос:

Я провожу небольшой эксперимент с WebSockets и Java. Очевидно, согласно последнему проекту WebSocket, сообщение может быть двоичным или простой строкой. Я использую Webbit server, и он выполняет две функции:

 public void onMessage(WebSocketConnection connection, String message) 

public void onMessage(WebSocketConnection connection, byte[] message)
  

Интересно, что имеет значение. Быстрее ли byte[]? Или почему это имеет значение? Я могу записать все, что я пишу, с байтами, потому что даже строка состоит из байтов при передаче, так почему у нас есть два множественных метода? Только Google Chrome 15 Beta и 16 Dev поддерживают двоичную передачу, поэтому я думал об использовании кодирования / декодирования Base64 как на клиенте, так и на сервере. Это единственное различие? Что, если я просто прочитаю каждый байт, составлю их в строку и отправлю? Я думаю, единственное отличие будет заключаться в том, что не все байты являются строковыми символами, поэтому я бы просто добавил накладные расходы при преобразовании в строку?

tl; dr -> В чем разница между передачей двоичных файлов и передачей строк?

Комментарии:

1. Сколько вопросов вы задаете !?

2. @Mob, я просто в замешательстве, на самом деле это один вопрос, в чем различия? Я просто взорвал вопрос, чтобы быть более понятным. Перефразирую, если хотите.

Ответ №1:

Протокол WebSocket (HyBi) поддерживает два разных типа полезной нагрузки: текстовую и двоичную. Текстовая полезная нагрузка представляет собой строковые данные в кодировке UTF-8. Любые ASCII-коды выше 127 в отправляемой вами строке будут преобразованы в двухбайтовую кодировку UTF-8. Для успешной отправки / получения необработанных двоичных данных вы, вероятно, захотите закодировать данные во что-то вроде base64 (который совместим с UTF-8).

Двоичный тип полезной нагрузки отправляется напрямую. Байты отправляются как есть в полезной нагрузке. Это более эффективно для пропускной способности. Это означает, что вам не нужно выполнять этап кодирования / декодирования. Байты, которые вы отправляете, отправляются напрямую, а к байтам, которые вы получаете, можно получить доступ напрямую без декодирования.

Комментарии:

1. к полученным байтам можно получить прямой доступ: верно ли это для всех клиентов, таких как Android (okhttp3) и ios (starscream)..

Ответ №2:

Когда вы используете двоичный режим, преобразование данных в UTF-8 перед их отправкой не выполняется. Что касается скорости, разница очень мала, поскольку кодировка текста в формате UTF-8 очень быстрая и незначительная. Похоже, они дают вам два варианта, чтобы вы могли отправлять эти данные любым способом в зависимости от того, какой тип данных вы хотите отправить.