SocketChannel:单个还是多个,哪个更好?

时间:2011-07-11 03:12:10

标签: java networking nio

SocketChannel 是线程安全的,因此客户端和服务器之间只需要一个通道进行通信。同时为读/写操作服务的通道

  但是,如果我们使用多通道(同一客户端和服务器之间的多个连接),io性能是否会得到改善?

  如果可以,为什么??????

  欢迎任何答复。

假设一个缓存客户端,它从远程服务器轮询数据。

public class Client(){
    public Object getThroungOneChannel(Object key){
       getTheUniqueChannel().write(request);
       waitForResponse();
    }

    public Object getWithMultiChannel(Object key){
       getChannelFromAPool().write(request)
       waitForResponse();
    }
}

哪种方式会有更好的io性能。

4 个答案:

答案 0 :(得分:1)

通常,客户端和服务器之间的单个连接是最好的方法。我无法想象在同一客户端和服务器之间传输相同数据的多个连接如何帮助。通过正确实现命令模式,您可以将通道的使用优化到最大,事实上这是NIO的全部优势。例如,假设即使您有一个线程写入阻塞生成数据的通道,您也可以让另一个线程将其他一些数据写入同一个通道,但您必须巧妙地编写代码以从NIO中提取最佳效果。

对于您的示例,我相信,在琐碎的情况下,getThroungOneChannel()将胜过getWithMultiChannel()

答案 1 :(得分:1)

通常使用多个TCP连接不会提高性能。

对于“长胖管网”,单个TCP连接无法使用所有可用带宽。在这种情况下,几个TCP连接可能会提高性能。

谷歌“长胖管”获取更多信息。

答案 2 :(得分:0)

有时候多个连接的性能优于单个连接,这通常是在ISP进行流量整形时,或者远程系统配置为仅为每个连接提供一定量的带宽时。

答案 3 :(得分:-1)

来自SocketChannel类的javadoc

“多个并发线程可以安全地使用套接字通道。它们支持并发读写,但最多只有一个线程可以读取,并且最多只有一个线程可以在任何给定时间写入.connect和finishConnect方法是相互的彼此同步,并且在调用其中一个方法的过程中尝试启动读取或写入操作将阻塞,直到调用完成。“

因此看起来通过多个线程的读/写被序列化。因此,一个通道的吞吐量有限。但是,如果您正在谈论拥有多个通道 - 假设它们都连接到客户端/服务器上的不同套接字(端口),它应该具有更多的IO性能。测试将能够证明这一点,以下是一些如何使用Socket和SocketChannel类进行此测试的示例。 http://www.exampledepot.com/taxonomy/term/196

HTH,K