gpt4 book ai didi

java - JPG 图像在 Java 中通过套接字发送时损坏或损坏

转载 作者:行者123 更新时间:2023-11-29 05:16:30 26 4
gpt4 key购买 nike

我正在尝试通过 java 中的套接字将 JPEG 图像从客户端发送到服务器。我将图像写入文件对象,然后使用 FileInputStream 将其读入 Byte[] 数组,然后再通过套接字发送数组。以下是客户端代码。

class TestingClient {
Socket s;
public TestingClient () {
try {
s = new Socket("localhost", 666);
}catch (UnknownHostException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
String imgPath = "C:/Users/huehuehue/Documents/Uni/D0036D/prick1.JPG";
File file = new File(imgPath);
byte[] bFile = new byte[(int) file.length()];
try {
FileInputStream fin = new FileInputStream(file);
fin.read(bFile);
fin.close();
OutputStream os = s.getOutputStream();
os.write(bFile, 0, bFile.length);
os.close();
System.out.println();
}catch(Exception e){
e.printStackTrace();
}
}
}

服务器将接收到的字节写出到两个单独的“.JPG”文件中,然后将接收到的字节读入缓冲图像,在将 JLabel 添加到简单 JFrame 时实例化 JLabel 时会调用它。这些文件本身无法通过 Windows 照片查看器查看,Windows 照片查看器对它们都声明“无法打开此图片,因为文件似乎已损坏、损坏或太大”。当程序尝试使用缓冲图像实例化 JLabel 时,将抛出未处理的异常“java.lang.NullPointerException”。代码中的所有控制台消息都按应有的方式打印出来。以下是服务器代码。

public class TestingServer {

InetAddress serverAddr;
BufferedImage img;

private class frame extends JFrame {

JLabel test;

private class aspectRatio {
int w = 16, h = 9;
}

public frame (BufferedImage y) {
aspectRatio aR = new aspectRatio ();
this.setVisible(true);
this.setSize(50*aR.w, 50*aR.h);
this.setTitle("TESTING");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.getContentPane().setBackground(Color.DARK_GRAY);

this.add(test = new JLabel(new ImageIcon(y)));
test.setBounds(25*aR.w, 13*aR.h, 15*aR.w, 10*aR.h);
}

}

public TestingServer () {
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(666);
Socket connect = serverSocket.accept();

System.out.println("So we read");
InputStreamReader ir = new InputStreamReader(connect.getInputStream());
FileOutputStream fos1 = new FileOutputStream(new File("C:/Users/huehuehue/Documents/Uni/D0036D/test1.JPG"));
int c=0;
while ((c = ir.read()) != -1) {
fos1.write(ir.read());
}
fos1.close();
System.out.println("finito1");

FileOutputStream fos2 = new FileOutputStream(new File("C:/Users/huehuehue/Documents/Uni/D0036D/test2.JPG"));
byte[] barr = new byte[34534];
int i = 0;
c = 0;
while ((c = ir.read()) != -1) {
barr[i] = (byte) c;
i++;
}
fos2.write(barr,0,i+1);
fos2.close();
System.out.println("finito2");

img = ImageIO.read(ImageIO.createImageInputStream(new ByteArrayInputStream(barr, 0, i)));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("image buffered");

frame f = new frame(img);

}

}

我有点卡住了,感谢任何帮助或指导 :) 提前致谢!

最佳答案

您正在使用 InputStreamReader,它会尝试将图像的字节转换为字符。您应该直接使用 InputStream,而不使用 Reader。或者最好使用 BufferedInputStream

此外,在填充第二个文件时,您继续从输入流中读取,尽管它已经给您 -1 指示流的结尾。相反,您应该在循环之前打开两个文件,并将您从输入流中读取的字节写入两次 - 一次写入第一个文件,一次写入第二个文件。

另一个问题是您在循环内再次调用 ir.read()(填充第一个文件)。这会丢弃您已经读取的字节,并读取下一个字节。所以本质上,您正在读取每个第二个字节。

所以你需要按照以下方式做一些事情:

iStream = new BufferedInputStream(connect.getInputStream());

FileOutputStream fos1 = new FileOutputStream(new File("C:/Users/huehuehue/Documents/Uni/D0036D/test1.JPG"));
FileOutputStream fos2 = new FileOutputStream(new File("C:/Users/huehuehue/Documents/Uni/D0036D/test2.JPG"));
int c=0;
while ((c = iStream.read()) != -1) {
fos1.write(c);
fos2.write(c);
}
fos1.close();
fos2.close();
iStream.close();

关于java - JPG 图像在 Java 中通过套接字发送时损坏或损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26344714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com