2012-11-12 108 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这是怎么做到的。 –