通过java套接字发送大文件时出现异常



我正在为一个大学项目创建一个java聊天,其中一个要求是每个用户都必须有一个图像关联,这可以通过注册窗口和数据修改窗口来完成,在注册中一切都很好,但在修改窗口中,当我试图发送大文件时,程序会抛出一个异常,两个代码(注册和修改)基本相同,只更改变量和路径,但仍然只在修改时出现问题

这是我的代码:

客户:

BufferedImage image = ImageIO.read(new    File(usuario.getImagen().getCanonicalPath()));
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
salida.write(size);
salida.write(byteArrayOutputStream.toByteArray());
salida.flush();

服务器:

dir = new File ("." + "/Documentos/Imagenes de Verificacion/" +
                    usuarioRegistro.getNombreDeUsuario() + ".jpg");
sizeAr = new byte[4];
entrada.read(sizeAr);
size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
imageAr = new byte[size];
entrada.readFully(imageAr);
image = ImageIO.read(new ByteArrayInputStream(imageAr));
ImageIO.write(image, "jpg", new File(dir.getCanonicalPath()));
usuarioRegistro.setImagen(dir.getCanonicalFile());

例外情况是:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
at javax.imageio.ImageIO.write(ImageIO.java:1520)
at com.ucab.javachat.Servidor.model.ServidorModel.run(ServidorModel.java:198)

行ServiorModel.java:198是:ImageIO.write(image,"jpg",new File(dir.getCanonicalPath()));

在我的测试中,我可以发送20、30、80、200 Kb的图像,但当我尝试发送2.1mb文件时,会出现错误。

我认为这与byteArray上的一些松散数据有关(可能是头数据?),但我不知道如何修复它,我的注册窗口方法使用相同的套接字和OutputStream发送数据,我成功地发送了一个24mb的图像。

根据文档:

返回一个BufferedImage,作为解码提供的文件的结果从当前已注册。该文件被包装在ImageInputStream中如果否注册的ImageReader声称能够读取得到的流,返回null。getUseCache和getCacheDirectory将用于控制创建的ImageInputStream。

请注意,没有将文件名作为字符串的读取方法;请在从文件名创建文件后使用此方法。

此方法不尝试定位可以读取的ImageReaders直接从文件;可以使用IIORegistry和ImageReaderSpi。

确保您注册了ImageReader或将文件包装在FileInputStream上,但由于您的实现有效,我敢打赌是图像导致了问题,因此

请确保您的图像类型为:GIF、PNG、JPEG、BMP和WBMP,因为这些都是类支持的类型。

相关内容

  • 没有找到相关文章

最新更新