q782878570 2017-10-02 09:09 采纳率: 0%
浏览 1149

Java nio服务端对同一个消息多次select如何处理

服务端代码

        private void listen() throws IOException {
        SocketChannel client;
        while (selector.select() > 0) {
            System.out.println("select");
            Set<SelectionKey> selectionKeys = selector.selectedKeys();
            Iterator<SelectionKey> keyIterator = selectionKeys.iterator();
            while (keyIterator.hasNext()) {
                SelectionKey key = keyIterator.next();
                //置空迭代器
                keyIterator.remove();
                try {
                    if (key.isAcceptable()) {
                        server = (ServerSocketChannel) key.channel();
                        client = server.accept();
                        client.configureBlocking(false);
                        client.register(selector,SelectionKey.OP_READ);
                    }else if (key.isReadable()) {
                        System.out.println("read");
                        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
                        SocketChannel readChannel = (SocketChannel) key.channel();
                        readChannel.read(readBuffer);
                        readBuffer.flip();
                        int i = readBuffer.getInt();
                        System.out.println("输出 " +i);
                    }
                    if (key.isWritable()) {

                    }
                }catch (IOException e) {
                    key.channel().close();
                    key.cancel();
                }
            }
        }
    }

客户端代码

     ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
        writeBuffer.putInt(111);
        try {
            client.write(writeBuffer);
        } catch (IOException e) {
            e.printStackTrace();
        }

服务端输出3次select 其中一次是连接accept 一次是接收消息 还有一次呢?
另外 在另一个程序中 服务端不断地对同一个消息处理 大概6次直到报错(这个程序是持续连接 另起线程)
求助

  • 写回答

1条回答 默认 最新

  • oyljerry 2017-10-02 13:17
    关注

    还有一次write,你服务端时刻缓冲区可写。

    评论

报告相同问题?

悬赏问题

  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作