2012-11-12 109 views
1

我試圖連接到遠程服務器,並在我的線程發送登錄消息:的Java NIO連接到插座

@Override 
public void run() { 
    try { 
     address = new InetSocketAddress(host, port); 
     incomingMessageSelector = Selector.open(); 
     socketChannel = SocketChannel.open();   
     socketChannel.configureBlocking(false); 
     socketChannel.connect(address); 
     socketChannel.register(incomingMessageSelector, SelectionKey.OP_READ); 
     serverManager.loginToServer(); 
    } 
} 

的登錄服務器()是將消息發送到服務器療法,但我的方法繼續收到:

java.nio.channels.NotYetConnectedException 

如何在發送此loginServer()方法之前檢查並等待連接?

+0

我建議你最初實施使用阻塞NIO。它更簡單,可以做你想做的事。注意:在NIO中,默認行爲是阻止的。 –

回答

0

我已經找到了答案..我應該使用:

socketChannel = SocketChannel.open(address);    
    socketChannel.configureBlocking(false); 

    while (!socketChannel.finishConnect()); 

    //my code after connection 

由於NIO是在不堵模式,我們必須等待,直到它完成其連接

+3

這是毫無意義的。只需在阻塞模式下進行連接並避免吸入CPU。或者註冊OP_CONNECT並使用select()並在觸發時調用finishConnect()。 – EJP

10

如果要連接在非阻塞模式,你應該:

  • 註冊通道OP_CONNECT
  • 火災時呼叫finishConnect()
  • 如果返回true,註銷OP_CONNECT取決於你想要什麼下一個
  • 做,如果返回false OP_READOP_WRITE註冊,什麼也不做,繼續選擇
  • 如果任一connect()finishConnect()拋出一個異常,關閉頻道,然後重試或忘記它,或告訴用戶或任何合適的。

如果在通道連接之前您不想執行任何操作,請在連接成功時執行阻塞模式下的連接並進入非阻塞模式。

+1

+1這是怎麼做到的。 –