2010-03-31 58 views
3

通常,您有一個綁定的tcp端口以及這些端口上的多個連接。至少通常有更多的連接作爲綁定端口。我的情況不同:我想綁定很多端口,通常沒有(或至少很少)連接。將NIO與IO混合使用

所以我想用NIO來接受傳入的連接。

但是,我需要將接受的連接傳遞給現有的jsch ssh庫。這需要IO套接字而不是NIO套接字,它會爲每個連接產生一個(或兩個)線程。但這對我來說很好。現在

,我認爲下面的線將帶來非常相同的結果:

Socket a = serverSocketChannel.accept().socket(); 
Socket b = serverSocketChannel.socket().accept(); 
SocketChannel channel = serverSocketChannel.accept(); 
channel.configureBlocking(true); 
Socket c = channel.socket(); 
Socket d = serverSocket.accept(); 

但是返回插槽的getInputStream()getOutputStream()功能似乎工作不同。只有當使用最後一次調用接受套接字時,jsch才能使用它。在前三種情況下,它失敗了(我很抱歉:我不知道爲什麼)。

那麼有沒有辦法將轉換成這樣的socket?

回答

-1

該序列工作在我們的生產環境:

final SocketAddress serverAddr = 
    new InetSocketAddress(
     bind_address, 
     server_port 
    ); 

final ServerSocketChannel serverChannel = ServerSocketChannel.open(); 

serverChannel.socket().bind(
    serverAddr, 
    backlog 
); 

final SocketChannel socketChannel = serverChannel.accept(); 

final Socket socket = socketChannel.socket(); 

final OutputStream out = socket.getOutputStream(); 

final InputStream in = socket.getInputStream(); 

所有通道都將在blocking模式默認。

請注意,我沒有顯示任何清理/異常處理代碼。

此外,還有一些bugs related to NIO and socket streams

+0

感謝您的回答,但這不適合我(見第二個答案)。此外,該錯誤是在5.0-beta,不應該再用了... – 2010-04-01 17:24:22

+0

@Steffen:這個錯誤在Java 6中仍然存在。 – 2010-04-01 18:44:44

+0

你鏈接的* single * bug不是'bug',並且沒有任何東西處理這個問題。 – EJP 2017-09-28 10:14:20

2

通過從SocketChannels獲得套接字返回的輸入和輸出流在一些點的信道上在內部同步。所以你不能將它們用於SSH等全雙工協議,因爲系統會鎖定。同樣適用於通過Channels類從渠道轉換的流(這是第一種情況)。

+0

這似乎解釋了我正在經歷的事情。有什麼辦法可以「解耦」它們嗎?請注意,在獲取流後,我不再使用已接受的頻道或套接字... – 2010-04-01 17:23:10

+0

它深深地在內部。 – EJP 2010-04-02 02:29:10