Должен ли я использовать java.io или java.nio для реализации моего сетевого клиента? - PullRequest
2 голосов
/ 19 июня 2011

Итак, я создаю игру, очень простой многопользовательский. У меня на стороне сервера используется асинхронный неблокирующий ввод / вывод (raw java.nio), но теперь мне нужно спроектировать клиент.

Я не уверен, как мне это сделать. Моя интуиция говорит мне, что использование NIO для клиента - это излишество (не то, чтобы он обрабатывал несколько соединений, верно?), Но мне нужно второе мнение.

Таким образом, для клиента с одним подключением лучше всего выбрать java.io или java.nio?

И, если наилучшим вариантом является стандартный ввод-вывод, все же рекомендуется использовать ByteBuffer s? Или просто обычные байтовые массивы?

Ответы [ 2 ]

2 голосов
/ 20 июня 2011

Производительность может отличаться, но она зависит от платформы и, скорее всего, незначительна.Например, тесты, которые я провел, показали, что NIO и стандартный ввод / вывод работают по-разному в Linux и Windows.При отправке больших объемов данных NIO работал лучше на платформе Linux, но в Windows все было наоборот.Примечание: я настроил сокеты для блокировки на NIO.При написании клиентского приложения нет особых причин использовать неблокирующие операции ввода-вывода и опроса.

Я бы не стал беспокоиться о производительности.Трудно сказать, что лучше в этом смысле.Иди с тем, что вам удобно.Если вы хотите использовать стандартный ввод-вывод, но все же хотели бы использовать ByteBuffers, то вы можете обернуть InputStream и OutputStream Socket, используя newChannel (InputStream) и newChannel (OutputStream) соответственно.Однако есть дополнительная нагрузка от дополнительной синхронизации и других проверок.Мой совет - использовать java.nio и использовать блокирующий ввод / вывод (configureBlocking(true)).

0 голосов
/ 20 июня 2011

Простой поток ввода-вывода намного проще в обращении и не обязательно медленнее.Он внутренне использует NIO, я думаю, для доступа к сети тоже.(Конечно, если вы можете просто повторно использовать код своего сервера, возможно, вы можете использовать его.)

Поскольку OutputStream не поддерживает запись ByteBuffer, здесь нет смысла его использовать.

(Отказ от ответственности: это только мое мнение (и опыт попытки перенести мой сетевой пакет потокового ввода-вывода на NIO). Я не уверен насчет наилучшей практики здесь.)

...