ImageIO写只加载一半图片(socket)
ImageIO write only load half the picture (socket)
我正在尝试使用套接字将图像从客户端发送到服务器。我可以将图像发送到服务器目录,但发送的图像不完整。
我应该改变什么?
客户代码:
Part filePart = request.getPart("file");
InputStream fileContent = filePart.getInputStream();
Socket clientSocket = new Socket("localhost",51519);
OutputStream outputStream = clientSocket.getOutputStream();
try {
BufferedImage image = ImageIO.read(fileContent);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
outputStream.write(size);
outputStream.write(byteArrayOutputStream.toByteArray());
}
catch (SocketException ex){
BLL_Common.write_log(ex.toString(), "");
} catch (IOException ex) {
BLL_Common.write_log(ex.toString(), "");
} finally {
outputStream.flush();
}
服务器代码:
String dir = "web/Admin/img/";
ServerSocket serverSocket = new ServerSocket(51519);
while(true) {
try {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] sizeAr = new byte[4];
inputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
byte[] imageAr = new byte[size];
inputStream.read(imageAr);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
String fileName = String.valueOf(System.currentTimeMillis());
ImageIO.write(image, "jpg", new File(dir + fileName + ".png"));
}
catch (SocketException ex) {
//...
} catch (IOException ex) {
//...
}
}
这是加载的图片:
您假设 read()
填满了缓冲区。你需要 DataInputStream.readFully()
.
边看边看DataOutputStream.writeInt()
。
当然你可以直接在套接字输入流上使用 ImageIO.read()
来避免这一切,同样地 ImageIO.write()
直接在套接字输出流上。但是除非原始图像不是 JPEG,否则您应该只复制字节,根本不使用 ImageIO
或 BufferedImage
。
我正在尝试使用套接字将图像从客户端发送到服务器。我可以将图像发送到服务器目录,但发送的图像不完整。 我应该改变什么?
客户代码:
Part filePart = request.getPart("file");
InputStream fileContent = filePart.getInputStream();
Socket clientSocket = new Socket("localhost",51519);
OutputStream outputStream = clientSocket.getOutputStream();
try {
BufferedImage image = ImageIO.read(fileContent);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", byteArrayOutputStream);
byte[] size = ByteBuffer.allocate(4).putInt(byteArrayOutputStream.size()).array();
outputStream.write(size);
outputStream.write(byteArrayOutputStream.toByteArray());
}
catch (SocketException ex){
BLL_Common.write_log(ex.toString(), "");
} catch (IOException ex) {
BLL_Common.write_log(ex.toString(), "");
} finally {
outputStream.flush();
}
服务器代码:
String dir = "web/Admin/img/";
ServerSocket serverSocket = new ServerSocket(51519);
while(true) {
try {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] sizeAr = new byte[4];
inputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
byte[] imageAr = new byte[size];
inputStream.read(imageAr);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
String fileName = String.valueOf(System.currentTimeMillis());
ImageIO.write(image, "jpg", new File(dir + fileName + ".png"));
}
catch (SocketException ex) {
//...
} catch (IOException ex) {
//...
}
}
这是加载的图片:
您假设 read()
填满了缓冲区。你需要 DataInputStream.readFully()
.
边看边看DataOutputStream.writeInt()
。
当然你可以直接在套接字输入流上使用 ImageIO.read()
来避免这一切,同样地 ImageIO.write()
直接在套接字输出流上。但是除非原始图像不是 JPEG,否则您应该只复制字节,根本不使用 ImageIO
或 BufferedImage
。