如果只有一个客户端并且需要完整的对象读取,Java NIO 的优势

标签 java sockets nio

假设 TCP 服务器的要求是它连接到单个客户端并且它写入和读取序列化的完整对象。读写频率高。鉴于需求,将代码从 java IO 移植到 java NIO 有什么优势?

当前代码是这样的。一个专用线程用于从套接字读取对象,一个专用线程用于将对象写入套接字。有一个单一的对象输入/输出流,对象正在被写入/读取。

// Reading from socket 
private SomeObject readObject() throws IOException, ClassNotFoundException {
    Object object = oiStream.readObject();
    if (object != null && object instanceof SomeObject) {
        SomeObject someObject = (SomeObject) object;
        return someObject;
    }
    return null;
}

    // Writing to socket 
    public void writeToSocket(SomeObject someObject) throws IOException {
    if (isSocketOpen()) {
        ooStream.writeObject(someObject);
        ooStream.flush();
    } 
}

考虑到只有一个客户端连接服务器这一事实,NIO 的等价物是什么?它的优势是什么?请不要讨论 Channels/Selectors/Buffers,而是根据给定的要求比较这两个库。

最佳答案

对象序列化比 IO 和 NIO 之间的区别贵得多,您不太可能注意到其中的区别。特别是序列化是为与 IO 一起工作而设计的。

如果你想提高速度我建议你尝试优化序列化。

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

http://vanillajava.blogspot.com/2011/10/serialization-using-bytebuffer-and.html

如果序列化不是问题,使用阻塞 NIO 比阻塞 IO 可以更快地传输数据。

http://vanillajava.blogspot.com/2010/07/java-nio-is-faster-than-java-io-for.html

关于如果只有一个客户端并且需要完整的对象读取,Java NIO 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963465/

相关文章:

java - JPA 软删除存储库 + 审核

java - 对象数组的字节数组

c - 对套接字使用 AES_ctr128_encrypt 时出现 SIGSEGV 错误

ruby 套接字 : Error (EINVAL) while trying to bind a sending socket to a port

linux - Linux 上的 UDP 服务器应用程序无法接收来自超过 150 个客户端的数据包

Java:在巨大的磁盘文件上进行随机读取的最快方法

java - 如何处理 picocli 中的错误?

java - 监听键/鼠标事件

java - Netty真的只为网络提供非阻塞IO吗?

java - 如何用netty实现机器人