当前位置: 首页 > 知识库问答 >
问题:

Java套接字选择器不会切换到写入状态

唐昊焜
2023-03-14

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

就像

    @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条消息),因为对方的未知问题,我们的合作伙伴切断了连接。我们重新建立了连接,但由于某些原因选择器并没有切换到只写状态读取。我们在read上收到很多信息,但无法发送任何信息<有什么想法吗?是我们这边的操作系统问题吗。选择器是如何工作的?通过某种逻辑或自发地从读切换到写?

共有1个答案

林和煦
2023-03-14

>

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

 类似资料:
  • 在我的客户端服务器应用程序中,我发现了一个奇怪的错误。我得到了以下方法: 每个方法向客户端发送一个字节数组 如果我只调用其中的2个,一切都正常,客户端会得到所有发送的字节数组。但是如果我调用所有3个,只有第一个和第二个到达客户端,以下方法的顺序并不重要。但是服务器说它们都是发送的。使用方法向客户端iam写入包中的所有长度也是有意义的。奇怪的一点来了: 如果我添加一个

  • 我转向你,在这件事上我一直把头撞在墙上。 我正在做一个小的socket编程,我可以看到当我把它放出来。println(“…”)while循环之前的代码行(in.readLine())它工作正常,但我需要它位于循环内部。 说清楚一点,我没有看到任何错误。我只是看不到此应用程序的客户端显示文本。它看起来好像在工作,但事实并非如此。此外,我也不控制该应用程序的客户端,它由通过TCP连接到此套接字侦听器应

  • 我正在尝试用套接字从客户端向服务器写入一个结构。 结构是: 这两个程序(服务器、客户机)的结构是相同的,并且这两个程序的结构是相同的。 客户端程序: 结构R*r; 马洛克.. ...(用数据填充结构) write(socket_fd,(void*)r,size of(R)); 服务器程序: 结构R*r; 马洛克.. read(client_fd,(R*)r,size of(R)); 这不是将结构从

  • 我正在尝试使用java套接字构建一个简单的多客户端聊天应用程序。我这样做的方式是,让一个客户机类连接到一个服务器类,该服务器类等待客户机连接,并创建一个新线程来处理该客户机(套接字连接在那里被读取和写入)。客户端还读取和写入到该线程的套接字连接。但是,当客户机写入套接字的输出流时,服务器不会响应。这里发布了一个类似的问题: 您可以同时写入套接字输入和输出流吗? 这里的一个答案是,只要在单独的线程上

  • 问题内容: 我的插座似乎有问题。在下面,您将看到一些分叉服务器和客户端的代码。服务器打开一个TCP套接字,客户端连接到它,然后关闭它。睡眠用于协调时间。在客户端close()之后,服务器尝试将write()写入其自己的TCP连接的末端。根据write(2)手册页,这 应该 给我一个SIGPIPE和一个EPIPE errno。但是,我看不到。从服务器的角度来看,写入本地关闭的套接字 成功 ,并且没有

  • 这几天又有一个挑战砸到了我的头。我正在尝试用Java创建一个FTP服务器,它应该能够与FileZilla FTP客户端通信。代码不是最好的,因为我尝试了很多方法来找出发生了什么。 这里的FileZilla日志从德语翻译 目前的主要问题是建立真正的联系。套接字已连接,我可以向客户端发送至少一条消息,但没有机会获取客户端输入,例如PASV、USER和PASS。 对于错误消息/打印堆栈: