Java-сокет writeUTF () и readUTF () - PullRequest
       1

Java-сокет writeUTF () и readUTF ()

11 голосов
/ 24 октября 2010

Я читал фрагмент кода Java-сокета и выяснил тот факт, что при обмене сокетами для последовательной отправки сообщений вам не нужно разделять их вручную, поток записи / чтения выполняет все автоматически. вы. Вот пример:

writer.java
writeUTF("Hello");
writeUTF("World");


reader.java
String a=readUTF(); // a=Hello
String a=readUTF(); // b=World

Я попробовал этот фрагмент кода, и он отлично работает. Тем не менее, мне интересно, должен ли этот стиль кодирования работать нормально. Существуют ли потенциальные риски последовательного использования потока сокетов без явного разделения каждого сегмента?

Ответы [ 3 ]

27 голосов
/ 24 октября 2010

writeUTF() и readUTF() записывают длину строки (в байтах, когда кодируется как UTF-8), за которой следуют данные, и используют модифицированное кодирование UTF-8 .Таким образом, есть некоторые потенциальные проблемы:

  • Максимальная длина строк, которые могут быть обработаны таким образом, составляет 65535 для чистого ASCII, меньше, если вы используете символы не-ASCII - и вы не можете легко предсказать ограничение вв этом случае, кроме консервативного предположения 3 байта на символ.Поэтому, если вы уверены, что никогда не будете отправлять строки длиной более 20 КБ, все будет в порядке.
  • Если приложению когда-либо понадобится общаться с чем-то другим (это не написано на Java), другая сторонаможет быть трудно обрабатывать модифицированный UTF-8.Для связи внутри приложения вам не нужно беспокоиться.
1 голос
/ 24 октября 2010

Согласно документации, методы readUTF и writeUTF работают с модифицированной версией UTF8, которая также добавляет длину символа, который должен быть прочитан в начале.

Это должно означать, что чтениеоперация будет ждать до тех пор, пока не будет выбрано достаточное количество символов, прежде чем возвращать строку ... это означает, что они фактически сегментированы, даже если вы этого не видите, поскольку вы просто декорируете потоки сокета с помощью DataInputStream и DataOutputStream.

В заключение, да, это должно быть совершенно безопасно, так как сам API позаботится о разделении отдельных сообщений.

0 голосов
/ 01 марта 2012

java.net.Socket работает нормально, поток ждет readUTF();

Но при использовании CumulativeProtocolDecoder мины не получается, выдает java.io.EOFException

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