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(); } }
loginServer()是一个向服务器发送消息的方法,但我不断得到:
java.nio.channels.NotYetConnectedException
如何在发送此loginServer()方法之前检查并等待连接?
如果您以非阻止模式连接,您应该:
- 注册
OP_CONNECT
的通道 - 当它触发时调用
finishConnect()
- 如果返回true,则取消注册
OP_CONNECT
并注册OP_READ
或OP_WRITE
具体取决于您下一步要做什么 - 如果它返回false,则不执行任何操作,继续选择
- 如果
connect()
或finishConnect()
抛出exception,请关闭该频道finishConnect()
试或忘记它或告诉用户或任何适当的内容。
如果在通道连接之前不想做任何事情,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。
我找到了答案..我应该使用:
socketChannel = SocketChannel.open(address); socketChannel.configureBlocking(false); while (!socketChannel.finishConnect()); //my code after connection
因为NIO处于非阻塞模式,我们必须等到它完成连接