никогда не выполняется, даже если файл равен 0 КБ. Когда будущее вернулось равно нулю? Пожалуйста, скажи мне, если знаешь, я буду признателен.

ичок в Нетти. Существует проблема с передачей файлов, смущающая меня в течение нескольких дней. Я хочу отправитьобраз файл с клиента на сервер.

Код ниже является исполняемым. Но только янеисправность Сервер принудительно может нормально открыть полученный файл изображения. В противном случае это показываетПохоже, у вас нет разрешения на просмотр этого файла. Проверьте разрешения и попробуйте сноваMsgstr "Итак, я хочу закрыть fileoutputstream, когда в ByteBuf нет данных, используяByteBuf.isReadable (), но блок else в методе channelRead в ServerHandler никогда не достигает. Это бесполезно.

Кроме того, если отправкатекст файл, он может быть нормально открыт, когда серверв живых. Я не хочу выключать сервер каждый раз после передачи, Пожалуйста, дайте мне несколько советов, чтобы решить это.

Это FileClientHandler

public class FileClientHandler extends ChannelInboundHandlerAdapter {

private int readLength = 8;

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    sendFile(ctx.channel());
}

private void sendFile(Channel channel) throws IOException {
    File file = new File("C:\\Users\\xxx\\Desktop\\1.png");
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);

    for (;;) {
        byte[] bytes = new byte[readLength];
        int readNum = bis.read(bytes, 0, readLength);
        // System.out.println(readNum);
        if (readNum == -1) {
            bis.close();
            fis.close();
            return;
        }
        sendToServer(bytes, channel, readNum);
    }
}

private void sendToServer(byte[] bytes, Channel channel, int length)
        throws IOException {
    channel.writeAndFlush(Unpooled.copiedBuffer(bytes, 0, length));
}

}

Это FileServerHandler

public class FileServerHandler extends ChannelInboundHandlerAdapter {

private File file = new File("C:\\Users\\xxx\\Desktop\\2.png");
private FileOutputStream fos;

public FileServerHandler() {
    try {
        if (!file.exists()) {
            file.createNewFile();
        } else {
            file.delete();
            file.createNewFile();
        }
        fos = new FileOutputStream(file);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg)
        throws Exception {
    try {
        ByteBuf buf = (ByteBuf) msg;
        if (buf.isReadable()) {
            buf.readBytes(fos, buf.readableBytes());
            fos.flush();
        } else {
            System.out.println("I want to close fileoutputstream!");
            buf.release();
            fos.flush();
            fos.close();
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

Ответы на вопрос(1)

Ваш ответ на вопрос