将 1 个 SocketChannel 用于 2-way "real-time communictation"
Using 1 SocketChannel for 2-way "real-time communictation"
我正在接收保存到 ByteBuffer 的连续数据流。
有时我需要写入通道,但是,重要的是不要丢失任何数据。是否可以使用选择器来解决这个问题?
如果我经常检查通道状态的选择器,它总是说通道当前正在读取,好像没有机会执行写入。无法使用多连接,因为服务器不支持
this.socketChannel = SocketChannel.open();
this.socketChannel.configureBlocking(false);
this.socketChannel.connect(new InetSocketAddress(IP, this.port));
try {
this.selector = Selector.open();
int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;
SelectionKey selectionKey = this.socketChannel.register(selector, interestSet);
while (selector.select() > -1) {
// Wait for an event one of the registered channels
// Iterate over the set of keys for which events are available
Iterator selectedKeys = selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = (SelectionKey) selectedKeys.next();
selectedKeys.remove();
try {
if (!key.isValid()) {
continue;
} else if (key.isReadable()) {
System.out.println("readable");
} else if (key.isWritable()) {
System.out.println("writable");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
编辑:
对不起,我没有添加更多信息。这是我的代码的重要部分。它总是打印 "readable" 到控制台,我希望 isWritable 块也被执行。
提前致谢,洪扎
您正在使用 else if
运算符,所以如果您的 key
是 可读的 检查它是否是 可写的 不会执行,但不代表通道不可可写。
实际上它可以同时可读和可写。但是在你的程序中,如果它是可读的,你只是不检查 writeable.
将else-if
替换为if
并查看结果。
我正在接收保存到 ByteBuffer 的连续数据流。 有时我需要写入通道,但是,重要的是不要丢失任何数据。是否可以使用选择器来解决这个问题?
如果我经常检查通道状态的选择器,它总是说通道当前正在读取,好像没有机会执行写入。无法使用多连接,因为服务器不支持
this.socketChannel = SocketChannel.open();
this.socketChannel.configureBlocking(false);
this.socketChannel.connect(new InetSocketAddress(IP, this.port));
try {
this.selector = Selector.open();
int interestSet = SelectionKey.OP_READ | SelectionKey.OP_WRITE;
SelectionKey selectionKey = this.socketChannel.register(selector, interestSet);
while (selector.select() > -1) {
// Wait for an event one of the registered channels
// Iterate over the set of keys for which events are available
Iterator selectedKeys = selector.selectedKeys().iterator();
while (selectedKeys.hasNext()) {
SelectionKey key = (SelectionKey) selectedKeys.next();
selectedKeys.remove();
try {
if (!key.isValid()) {
continue;
} else if (key.isReadable()) {
System.out.println("readable");
} else if (key.isWritable()) {
System.out.println("writable");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
编辑: 对不起,我没有添加更多信息。这是我的代码的重要部分。它总是打印 "readable" 到控制台,我希望 isWritable 块也被执行。
提前致谢,洪扎
您正在使用 else if
运算符,所以如果您的 key
是 可读的 检查它是否是 可写的 不会执行,但不代表通道不可可写。
实际上它可以同时可读和可写。但是在你的程序中,如果它是可读的,你只是不检查 writeable.
将else-if
替换为if
并查看结果。