gpt4 book ai didi

Java Socket 选择器不切换到写入状态

转载 作者:行者123 更新时间:2023-12-01 11:42:29 24 4
gpt4 key购买 nike

我们实现了基于选择器的解决方案

喜欢

    @Override
public void run() {
super.run();
while (session.isConnectionAlive()) {
try {
// Wait for an event
selector.select();
} catch (IOException e) {
log.error("Selector error: {}", e.toString());
log.debug("Stacktrace: ", e);
session.closeConnection();
break;
}
handleSelectorkeys(selector.selectedKeys());
}
executorService.shutdown();
log.debug("Ucp worker stopped");
}

private void handleSelectorkeys(Set<SelectionKey> selectedKeys) {
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey selKey = keys.next();
selector.selectedKeys().remove(selKey);
try {
processSelectionKey(selKey);
} catch (IOException e) {
// Handle error with channel and unregister
selKey.cancel();
log.error("Selector error: {}", e.toString());
log.debug("Stacktrace: ", e);
}
}
}

public void processSelectionKey(SelectionKey selKey) throws IOException {

// Since the ready operations are cumulative,
// need to check readiness for each operation
if (selKey.isValid() && selKey.isConnectable()) {
log.debug("connectable");
// Get channel with connection request
SocketChannel sChannel = (SocketChannel) selKey.channel();

boolean success = sChannel.finishConnect();
if (!success) {
// An error occurred; handle it
log.error("Error on finish");
// Unregister the channel with this selector
selKey.cancel();
}
}

if (selKey.isValid() && selKey.isReadable()) {
readMessage(selKey);
}

if (selKey.isValid() && selKey.isWritable()) {
writeMessage(selKey);
}

if (selKey.isValid() && selKey.isAcceptable()) {
}

}

它工作得很好,直到我们开始每秒发送大约 100 条消息,并收到大约 100 条响应和 100 条收入消息,并发送 100 条我们的响应(两种方式每秒大约 400 条消息)由于未知原因,不时会出现这样的负载另一边的问题是我们的合作伙伴切断了连接。我们重新建立连接,但由于某种原因选择器不会切换到仅读取的写入状态。我们收到很多已读消息,但无法发送任何内容。
有任何想法吗?是我们这边的操作系统问题吗?选择器如何工作?通过某种逻辑或自发地从读切换到写?

最佳答案

  1. 不存在“从读状态切换到写状态”这样的事情。套接字可以同时可读和可写,并且选择器不会“切换”:它只是报告套接字上存在哪些状态。

  2. 如果写入事件从未触发,这是因为套接字发送缓冲区已满,这表明对等方没有从连接中读取数据。

关于Java Socket 选择器不切换到写入状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422400/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com