【问题标题】:Illegal blocking mode exception while attempting to read from socket尝试从套接字读取时出现非法阻塞模式异常
【发布时间】:2017-09-10 07:42:42
【问题描述】:

我对 Java 还是很陌生,正在尝试编写发送者通道接收器设置,其中通道代表传输介质并将错误引入数据包。因此,通道使用服务器套接字通道连接到发送方和接收方。 大部分都很好,但是当我尝试在频道中读取对象Packet 时,它会抛出IllegalBlockingModeException。发件人抛出似乎是相应的 IO 异常,“现有连接被远程主机强行关闭”。 Channel程序中的代码如下(为简单起见,排除了一些部分):

Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
while (keyIterator.hasNext()) {
    SelectionKey key = keyIterator.next();
    keyIterator.remove();
    if (key.isAcceptable()) {
        SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
        sc.configureBlocking(false);
        sc.register(selector, SelectionKey.OP_READ);
    }
    if (key.isReadable()) {
        SocketChannel sc = (SocketChannel) key.channel();
        sc.configureBlocking(false);
        Packet packet = readPacket(sc);
        sc.close();
        // do things with the packet...

其中readPacket定义如下:

private static Packet readPacket(SocketChannel sc) throws IOException, 
ClassNotFoundException {
    ObjectInputStream in = new 
    ObjectInputStream(sc.socket().getInputStream());
    Packet packet = (Packet) in.readObject();
    return packet;
}

有人能解释一下是什么引发了异常以及如何纠正它吗?

【问题讨论】:

    标签: java sockets serialization network-programming inputstream


    【解决方案1】:

    流正在阻塞。您不能在非阻塞模式下使用它们。请参阅 Javadoc。

    【讨论】:

    • 确实,我在 Javadoc 中看到了这一点。所以我要问的是如何纠正这个问题?如果不使用流,我如何读取套接字?
    • 可以通过流读取它,但不能在非阻塞模式下读取。序列化和 NIO 非常不合适。决定。一个或另一个。
    猜你喜欢
    • 2012-07-24
    • 2011-12-27
    • 1970-01-01
    • 2016-04-11
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2013-10-10
    相关资源
    最近更新 更多