尝试从套接字

时间:2017-09-10 07:42:43

标签: java sockets serialization network-programming inputstream

我是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;
}

是否有人能够解释什么是抛出异常以及如何纠正它?

1 个答案:

答案 0 :(得分:0)

Streams正在阻止。您不能在非阻塞模式下使用它们。见Javadoc。