2011-07-11 78 views
2

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

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

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

欢迎任何答案。
SocketChannel:单个或多个,哪个更好?

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

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

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

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

+0

你指的是同一个连接的多个通道?你怎么能为同一个连接获得两个不同的频道? –

+0

连接不一样,但在同一个客户端和服务器之间使用多个连接 – jilen

+0

+1这个问题doesent应该得到一个downvote。 –

回答

1

一般情况下,客户端和服务器之间的单一连接是最好的一段路要走。我无法想象多个连接如何在相同的客户端和服务器之间传输相同的数据。通过正确执行命令模式,您可以将通道的使用情况优化为最大,实际上这是NIO的全部优势。例如,假设即使你有一个线程写入一个被阻塞的数据生成通道,也可能有另一个线程将一些其他数据写入同一个通道,但是你必须巧妙地编写代码,以便从NIO中提取出最好的数据。

而且为你给出的例子,我相信,在平凡的情况下,getThroungOneChannel()将跑赢getWithMultiChannel()

+0

我有更新的问题。情况是我希望客户端同时执行发送请求。感谢您的回答。 – jilen

+0

我已经取消了我的回答 –

-1

从SocketChannel类

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

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

HTH,K

+0

我已阅读文档。它只表示'connect'和'finishConnect'是相互同步的。这并不意味着像read/wirte这样的其他操作可以同时执行! – jilen

+0

我感到困惑的是,物理网络设备也可能以服务器串行化的方式请求。所以多连接可能没有意义 – jilen

+1

-1。网络是决定速度的步骤,而不是CPU或线程。 – EJP

0

可以有时间时,多个连接优于单一的连接,而这通常发生在ISP的网站流量整形,或当远程系统配置为仅为每个连接传送一定量的带宽。

0

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

如果是“长管网”,单个TCP连接不能使用所有可用带宽。在这种情况下,多个TCP连接可能会提高性能。

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