никогда не выполняется, даже если файл равен 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();
}
}
}