JavaNIO连接到套接字
我正在尝试连接到远程服务器并在我的线程中发送登录消息:JavaNIO连接到套接字,java,nio,Java,Nio,我正在尝试连接到远程服务器并在我的线程中发送登录消息: @Override public void run() { try { address = new InetSocketAddress(host, port); incomingMessageSelector = Selector.open(); socketChannel = SocketChannel.open(); socketChannel
@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
在发送此登录服务器方法之前,如何检查并等待连接?我找到了答案。。我应该使用:
socketChannel = SocketChannel.open(address);
socketChannel.configureBlocking(false);
while (!socketChannel.finishConnect());
//my code after connection
由于NIO处于非阻塞模式,我们必须等待它完成连接我找到了答案。。我应该使用:
socketChannel = SocketChannel.open(address);
socketChannel.configureBlocking(false);
while (!socketChannel.finishConnect());
//my code after connection
由于NIO处于非阻塞模式,我们必须等待它完成连接如果以非阻塞模式连接,则应: 注册OP_CONNECT的通道 当它触发时,请调用finishConnect 如果返回true,则取消注册OP_CONNECT并注册OP_READ或OP_WRITE,具体取决于接下来要执行的操作 如果返回false,则不执行任何操作,继续选择 如果connect或finishConnect引发异常,请关闭通道并重试,或者忘记它,或者告诉用户或任何适当的信息。
如果在通道连接之前不想执行任何操作,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。如果在非阻塞模式下进行连接,则应: 注册OP_CONNECT的通道 当它触发时,请调用finishConnect 如果返回true,则取消注册OP_CONNECT并注册OP_READ或OP_WRITE,具体取决于接下来要执行的操作 如果返回false,则不执行任何操作,继续选择 如果connect或finishConnect引发异常,请关闭通道并重试,或者忘记它,或者告诉用户或任何适当的信息。
如果在通道连接之前您不想做任何事情,请在阻塞模式下进行连接,并在连接成功时进入非阻塞模式。我建议您首先使用阻塞NIO实现。它更简单,可以做你想做的事。注意:在NIO中,默认行为是阻塞。我建议您首先使用阻塞NIO实现。它更简单,可以做你想做的事。注意:在NIO中,默认行为是阻塞。这是毫无意义的。只需在阻塞模式下进行连接,避免占用CPU。或者注册OP_CONNECT并在其启动时使用select并调用finishConnect。这是毫无意义的。只需在阻塞模式下进行连接,避免占用CPU。或者注册OP_CONNECT,并在触发时使用select和call finishConnect。