我应该在网络客户端实现中使用java.io还是java.nio?

我应该在网络客户端实现中使用java.io还是java.nio?,java,io,client,nio,Java,Io,Client,Nio,所以我正在创建一个游戏,非常基本的多人游戏。我已经使用异步非阻塞I/O(rawjava.nio)关闭了服务器端,但现在我需要设计客户端 我不知道该怎么做。我的直觉告诉我,将NIO用于客户机是一种过激的行为(它不像是要处理多个连接,对吗?),但我需要第二种意见 所以问题是,对于单个连接客户端,使用java.io或java.nio的最佳选择是什么 而且,如果最好的选择是标准I/O,那么使用ByteBuffers是否仍然是一种良好的做法?或者只是普通的字节数组?简单的流I/O更容易处理,但不一定慢。我

所以我正在创建一个游戏,非常基本的多人游戏。我已经使用异步非阻塞I/O(raw
java.nio
)关闭了服务器端,但现在我需要设计客户端

我不知道该怎么做。我的直觉告诉我,将NIO用于客户机是一种过激的行为(它不像是要处理多个连接,对吗?),但我需要第二种意见

所以问题是,对于单个连接客户端,使用
java.io
java.nio
的最佳选择是什么


而且,如果最好的选择是标准I/O,那么使用
ByteBuffer
s是否仍然是一种良好的做法?或者只是普通的字节数组?

简单的流I/O更容易处理,但不一定慢。我认为,它在内部使用NIO进行网络访问。(当然,如果您可以简单地重用服务器的代码,那么使用它可能是一种选择。)

由于OutputStream不支持编写ByteBuffer,因此在这里使用它没有意义


(免责声明:这只是我的观点(以及尝试将基于流IO的网络包移植到NIO的经验)。我不确定这里的最佳做法。)

性能可能会有所不同,但它取决于平台,而且很可能无关紧要。例如,我所做的测试表明,NIO和标准I/O在Linux和Windows上的性能不同。当发送大量数据时,NIO在Linux平台上的性能更好,但在Windows上则相反。注意:我已将套接字配置为在NIO上阻塞。在编写客户端应用程序时,几乎没有理由使用非阻塞I/O和轮询


我不会担心性能。从这个意义上说,很难说哪个更好。随大流。如果您希望使用标准I/O,但仍然希望使用ByteBuffers,那么可以分别使用and包装套接字的
InputStream
OutputStream
。但是,额外的同步和其他检查会带来开销。我的建议是使用
java.nio
并使用阻塞I/O(
configureBlocking(true)
)。

重用我的服务器代码会非常容易,这可能也会使我的数据编码/解码更容易(复制和粘贴新方法?:p),而我的意思是使用字节缓冲区,我之所以这么说是因为它有普通字节数组所没有的额外方法
OutputStream
当然支持
write(byte[])
并且
ByteBuffer
具有
byte[](array())
方法。如果您只需要编码/解码方法,那么数据(In | Out)putStream可能值得一看。如果可能的话,避免复制+粘贴。另一方面,对协议进行第二次(独立)实现有助于确保操作正确。这意味着您应该首先写下协议。请注意,如果您使用Data(In | Out)putStream,请确保将socket(In | Out)putStream包装在缓冲(In | Out)流下,否则I/O可能会非常昂贵。我在这些数据流类中使用的唯一方法是readUnsigned(Short | Byte),我不确定是否值得进行额外的强制转换/初始化。那么我在前面的评论中发布的内容呢:只需使用
ByteBuffer.array()
进行写入,然后使用类似
InputStream.read(ByteBuffer.array()的内容)
阅读?@David:是的,这也是一个可行的选择。实际上,这可能比使用
newChannel
方法要好,因为同步和其他检查没有额外的开销。我还忘记了,如果使用
newChannel
,I/O操作将是非阻塞的。我将对我的post:)。@David更正:从Channels.newChannel()派生的通道中的I/O将被阻塞。@EJP:你说得对,对不起。我上次检查时好像误读了代码。