使用1个SocketChannel进行双向"实时通信"

时间:2015-09-03 14:42:02

标签: java socketchannel

我收到了一个连续的数据流,我将其保存到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();
    }

编辑: 对不起,我没有添加更多信息。这是我的代码中的一个重要部分。它始终打印"可读"到控制台,我希望isWritable块也会被执行。

提前致谢,Honza

1 个答案:

答案 0 :(得分:2)

您正在使用else if运营商,因此如果key 可读,则检查是否可写将无法执行,但它不会#39; t表示频道不是可写

实际上它可能同时可读可写。但是在你的程序中,如果它是可读的,你就不要检查可写

else-if替换为if并查看结果。