Java 视频聊天应用程序输入输出流不工作
Java Video Chat applicataion input output stream not working
我正在制作一个视频聊天应用程序,它使用 java 网络(也称为套接字)将网络摄像头的图像发送到另一个客户端。
我的代码首先发送缓冲图像数据的长度,然后发送实际数据。服务器还首先读取一个 int,然后读取数据本身。第一张图像有效,但在它之后,数据输入流读取一个负数作为长度。
服务器端:
frame = new JFrame();
while (true) {
try {
length = input.readInt();
System.out.println(length);
imgbytes = new byte[length];
input.read(imgbytes);
imginput = new ByteArrayInputStream(imgbytes);
img = ImageIO.read(imginput);
frame.getContentPane().add(new JLabel(new ImageIcon(img)));
frame.pack();
frame.setVisible(true);
}
catch(IOException e){
e.printStackTrace();
}
}
客户端:
while(true) {
try {
currentimg = webcam.getImage();
ImageIO.write(currentimg, "jpg", imgoutputstream);
imgbytes = imgoutputstream.toByteArray();
out.writeInt(imgbytes.length);
out.write(imgbytes);
} catch (IOException e) {
e.printStackTrace();
}
}
在客户端,您总是将新图像写入现有流。这导致每次迭代中数组大小增加。在 java 中,int
的最大值为 2147483647
。如果你增加这个整数,它会跳到最小值 auf int
,它是负的(见 this article)。
因此,要修复此错误,您需要在写入下一张图像之前清除流,以便大小永远不会大于整数的最大值。
我正在制作一个视频聊天应用程序,它使用 java 网络(也称为套接字)将网络摄像头的图像发送到另一个客户端。
我的代码首先发送缓冲图像数据的长度,然后发送实际数据。服务器还首先读取一个 int,然后读取数据本身。第一张图像有效,但在它之后,数据输入流读取一个负数作为长度。
服务器端:
frame = new JFrame();
while (true) {
try {
length = input.readInt();
System.out.println(length);
imgbytes = new byte[length];
input.read(imgbytes);
imginput = new ByteArrayInputStream(imgbytes);
img = ImageIO.read(imginput);
frame.getContentPane().add(new JLabel(new ImageIcon(img)));
frame.pack();
frame.setVisible(true);
}
catch(IOException e){
e.printStackTrace();
}
}
客户端:
while(true) {
try {
currentimg = webcam.getImage();
ImageIO.write(currentimg, "jpg", imgoutputstream);
imgbytes = imgoutputstream.toByteArray();
out.writeInt(imgbytes.length);
out.write(imgbytes);
} catch (IOException e) {
e.printStackTrace();
}
}
在客户端,您总是将新图像写入现有流。这导致每次迭代中数组大小增加。在 java 中,int
的最大值为 2147483647
。如果你增加这个整数,它会跳到最小值 auf int
,它是负的(见 this article)。
因此,要修复此错误,您需要在写入下一张图像之前清除流,以便大小永远不会大于整数的最大值。