Если мне нужно отправить только 1 байт через сокет, могу ли я просто использовать один символ? - PullRequest
0 голосов
/ 13 января 2019

У меня есть клиент-серверная программа, использующая TCP. Теперь я хочу отправлять разные сообщения разного размера. Я прочитал, что char в Java составляет 2 байта. Если я использую UTF-8, могу ли я просто отправить char, и он будет иметь размер 1 байт?

Также, что лучше использовать: DataInputStream и DataOutputStream или BufferedInputStream и BufferedOutputStream?

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Кодировка UTF-8 использует от 1 до 4 байтов для хранения символов, поэтому не гарантируется, что это будет только 1 байт.

Если вы хотите отправить только один байт, просто используйте тип байтового примитива.

Попробуйте этот код:

try (BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream())) {
        String myString = "Hello";
        byte arr[] = myString.getBytes("UTF-8");
        out.write(arr);
    } catch (IOException e) {
        e.printStackTrace();
    }
0 голосов
/ 13 января 2019

Вы хотите использовать OutputStreamWriter для упаковки OutputStream. Это позволит вам указать кодировку и написать char с вместо byte с. Задача OutputStreamWriter состоит в том, чтобы знать кодировку и соответствующим образом конвертировать char с в byte с. Если вы указали, что ваш OutputStreamWriter использует UTF-8, и вы пишете символ, который использует один байт в UTF-8, вы можете ожидать, что в поток будет записан только один байт.

try (OutputStreamWriter writer = new OutputStreamWriter(myOutputStream, "UTF-8")) {
    writer.write('x');
}

Вы также можете обернуть OutputStreamWriter в BufferedWriter для повышения эффективности.

Но выполнить кодирование самостоятельно, используя метод getBytes класса String, - просто заново изобрести колесо. Не делай этого.

Более подробную информацию о OutputStreamWriter можно найти в Javadoc .

0 голосов
/ 13 января 2019

Обычное соглашение в Java - записывать байты с использованием OutputStream. Ни один из методов здесь не принимает char. Вам необходимо преобразовать символ в массив byte[], например

OutputStream out = ...
byte[] bytes = "my string".getBytes(Charset.forName("UTF-8"));
out.write(bytes);

Если вы планируете использовать розетки, вы можете проверить Socket.getOutputStream() метод:

Возвращает выходной поток для этого сокета.

Если с этим сокетом связан канал, результирующий выходной поток делегирует все свои операции этому каналу. Если канал находится в неблокирующем режиме, то при операциях записи выходного потока будет выброшено IllegalBlockingModeException.

Закрытие возвращенного OutputStream закроет связанный сокет.

...