Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果只有一个客户机并且需要完整的对象读取,Java NIO的优势_Java_Sockets_Nio - Fatal编程技术网

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

如果只有一个客户机并且需要完整的对象读取,Java NIO的优势,java,sockets,nio,Java,Sockets,Nio,假设TCP服务器需要连接到单个客户端,并写入和读取序列化的完整对象。阅读和写作的频率很高。根据需求,将代码从JavaIO移植到JavaNIO有什么好处 当前代码是这样的。。用于从套接字读取对象的专用线程和用于将对象写入套接字的专用线程。有一个对象输入/输出流,对象被写入/读取到其中 // Reading from socket private SomeObject readObject() throws IOException, ClassNotFoundException { Obj

假设TCP服务器需要连接到单个客户端,并写入和读取序列化的完整对象。阅读和写作的频率很高。根据需求,将代码从JavaIO移植到JavaNIO有什么好处

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

// 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的等效性及其优势是什么。请不要讨论通道/选择器/缓冲区,而是根据给定要求比较两个库

重要的不是客户端的数量,而是并发连接的数量。当你说“单客户端”时,这是否意味着一次不会有多个连接?如果是这样,那么我看不出使用NIO有什么好处,因为服务器应该能够在一个线程中处理所有事情。

对象序列化比IO和NIO之间的差异要昂贵得多,因此您不太可能注意到这一差异。esp as序列化旨在与IO一起工作

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

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


阻塞NIO可能比阻塞IO更快。当您使用direct ByteBuffers减少本机空间和Java堆之间的副本数时,就会发生这种情况。@Mike感谢您的回答。是的,你是对的,在给定的时间只有一个来自一个客户端的连接。我正在评估是否有必要使用一个客户端和一个连接到NIO,但数据频率很高。感谢您的回复和您提到的几个链接。序列化很好,我正在使用externalizable。我查看了最后一个链接,发现对于一个客户端,即使每个套接字有一个线程(905 IO Vs 991 NIO MB/s),也存在差异,尽管我想知道这种差异的根源是什么。您需要对序列化进行基准测试,因为使用Externalizable,您仍然不会接近900 MB/s。使用直接ByteBuffer可以减少系统中数据的复制量。顺便说一句:除非您使用10 Gig E链路,否则对于1 Gb网络,您将被限制在~100 MB/s。我看到了ByteBuffer示例,通过查看一些示例可以看到它创建了大量对象。示例:在IO中,一个客户端只有一个objectoutputstream,但在NIO中,似乎(如果我错了,请纠正我),您需要为发送的每个对象创建objectoutputstream。考虑到数据的高频率,这不是一个问题。我使用太阳耀斑进行评估。不,我没有尝试过内核旁路,尽管我读过它。我想你指的是SDP?。但回到我最初的问题。然后,您会建议我尝试为一个客户机使用NIO或ApacheMina(NIO之上的层)或其他库并读取/写入对象吗?奇怪的代码。为什么要忽略已发送的对象?除非您计划发送空值,否则测试空值是徒劳的,在这种情况下正确的技术是不发送空值。而且某个对象的
null实例
无论如何都是
false