【发布时间】:2020-01-10 13:50:43
【问题描述】:
我已成功发送小(小于约 22mb)图像,但在发送较大图像时出现如下所示的错误。我希望能够重用套接字,因此不关闭它。
正如您可能看到的,我正在尝试将图片从客户端发送到服务器,如果我在控制台中键入 s,它将在服务器上显示。
javax.imageio.IIOException: 读取 PNG 图像数据时出错
在 java.desktop/com.sun.imageio.plugins.png.PNGImageReader.readImage(未知来源)
在 java.desktop/com.sun.imageio.plugins.png.PNGImageReader.read(未知来源)
在 java.desktop/javax.imageio.ImageIO.read(未知来源)
在 java.desktop/javax.imageio.ImageIO.read(未知来源)
在 lärning5.Server.main(Server.java:55)原因:java.io.EOFException: ZLIB 输入流意外结束
在 java.base/java.util.zip.InflaterInputStream.fill(Unknown Source)
在 java.base/java.util.zip.InflaterInputStream.read(未知来源)
在 java.base/java.io.BufferedInputStream.fill(Unknown Source)
在 java.base/java.io.BufferedInputStream.read1(未知来源)
在 java.base/java.io.BufferedInputStream.read(Unknown Source)
在 java.base/java.io.DataInputStream.readFully(未知来源)
在 java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodePass(未知来源)
在 java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodeImage(未知来源)
... 5 更多
我尝试使用ObjectOutputStream 将图像作为对象发送,最终需要关闭套接字。我还尝试扩大缓冲区,以便它们能够容纳这么多内存。我尝试过使用ByteArrayInputStream 和ByteArrayOutputStream“正确的方式”,其中我获得了ByteArray 的大小,但我总是得到相同的错误消息。
尽量忽略cmets
服务器代码
package lärning5;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Server
{
static ServerSocket servern;
static Socket client = new soketen();
static OutputStream out;
static InputStream in;
static JFrame fön = new JFrame();
static Panelen pan = new Panelen();
static BufferedImage picture;
static Scanner read = new Scanner(System.in);
public static void main(String args[])
{
try
{
servern = new ServerSocket(7777, 9999);
client = servern.accept();
System.out.print("conectad");
out = client.getOutputStream();
out.flush();
in = client.getInputStream();
byte[] buffer = new byte[899999];
in.read(buffer, 0, buffer.length);
ByteArrayInputStream bil = new ByteArrayInputStream(buffer, 0, buffer.length);
picture = ImageIO.read(bil);
} catch (Exception e)
{
System.out.print("gg wp ");
e.printStackTrace();
}
if (read.nextLine().equals("s"))
{
fön.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
fön.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fön.add(pan);
fön.repaint();
fön.setVisible(true);
}
}
}
客户端代码
package lärning6;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
public class Client
{
static Socket servern;
static OutputStream out;
static InputStream in;
static Robot datorn;
static BufferedImage picture;
static ImageInputStream bil;
static File fil = new File("src\\bilder\\ddeee.PNG");
public static void main(String args[])
{
try
{
servern = new Socket(InetAddress.getByName("the ip address"), 7777);
out = servern.getOutputStream();
out.flush();
in = servern.getInputStream();
//byte[] buffer = new byte[90000];
ByteArrayOutputStream bil = new ByteArrayOutputStream();
picture = ImageIO.read(fil);//datorn.createScreenCapture(new Rectangle(0, 0, 500, 500));
ImageIO.write(bild, "PNG", bil);
out.write(bil.toByteArray());
/*
bil = ImageIO.createImageInputStream(picture);
//bil.read(buffer, 0, buffer.length);
ImageOutputStream bil = null;
ImageIO.write(picture, "png", bil);
buffer = bil.*/
}catch(Exception e)
{
System.out.print("gg wr");
e.printStackTrace();
}
}
}
面板
package lärning5;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Panelen extends JPanel
{
public void paintComponent(Graphics g)
{
g.drawImage(Server.picture, 0, 0, this.getWidth(), this.getHeight(), null);
}
}
上面的代码和下面的代码是两个不同的代码,不应合并
下面的代码是使用适应图片大小的缓冲区的代码。
服务器
package lärning5;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Server
{
static ServerSocket servern;
static Socket client = new soketen();
static OutputStream out;
static InputStream in;
static JFrame window = new JFrame();
static Panelen panel = new Panelen();
static BufferedImage bild;
static File fil = new File("src\\bilde\\bilden.jpg");
static Scanner läs = new Scanner(System.in);
public static void main(String args[])
{
try
{
servern = new ServerSocket(7777, 9999);
client = servern.accept();
System.out.print("conectad");
out = client.getOutputStream();
out.flush();
in = client.getInputStream();
byte[] buffer = new byte[4];
//in.read(buffer);
//ImageOutputStream bil = ImageIO.createImageOutputStream(bild);
in.read(buffer);
byte[] buffer2 = new byte[ByteBuffer.wrap(buffer).asIntBuffer().get()];
in.read(buffer2);
ImageIO.write(ImageIO.read(new ByteArrayInputStream(buffer2)), "PNG", new File("C:\\Users\\Bodi\\Desktop\\testse"));
bild = ImageIO.read(new ByteArrayInputStream(buffer2));
} catch (Exception e)
{
System.out.print("gg wp ");
e.printStackTrace();
}
if (läs.nextLine().equals("s"))
{
window.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.add(panel);
window.repaint();
window.setVisible(true);
}
}
}
客户
package lärning6;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
public class Client
{
static Socket servern;
static OutputStream out;
static InputStream in;
static Robot datorn;
static BufferedImage picture;
static ImageInputStream bil;
static File fil = new File("src\\bilder\\dddd.PNG");
public static void main(String args[])
{
try
{
servern = new Socket(InetAddress.getByName("The ip adress"), 7777);
out = servern.getOutputStream();
out.flush();
in = servern.getInputStream();
//byte[] buffer = new byte[90000];
ByteArrayOutputStream bil = new ByteArrayOutputStream();
picture = ImageIO.read(fil);//datorn.createScreenCapture(new Rectangle(0, 0, 500, 500));
ImageIO.write(picture, "PNG", bil);
byte[] storlek = ByteBuffer.allocate(4).putInt(bil.size()).array();
out.write(storlek);
out.write(bil.toByteArray());
out.flush();
/*
bil = ImageIO.createImageInputStream(picture);
//bil.read(buffer, 0, buffer.length);
ImageOutputStream bil = null;
ImageIO.write(picture, "png", bil);
buffer = bil.*/
}catch(Exception e)
{
System.out.print("gg wr");
e.printStackTrace();
}
}
}
错误有点不同
错误
conectadgg wp javax.imageio.IIOException: Error reading PNG image data
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.readImage(Unknown Source)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.read(Unknown Source)
at java.desktop/javax.imageio.ImageIO.read(Unknown Source)
at java.desktop/javax.imageio.ImageIO.read(Unknown Source)
at lärning5.Server.main(Server.java:134)
Caused by: javax.imageio.IIOException: Unknown row filter type (= 148)!
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodePass(Unknown Source)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.decodeImage(Unknown Source)
... 5 more
我希望服务器能够顺利启动而不会出现任何错误,并且客户端能够顺利运行而不会出现任何错误。
但是当他们连接时,我希望服务器接收字节数组,但随后弹出错误仍在运行但什么也不做。您应该仍然可以按“s”,这将打开一个空白窗口。但这是错误的。
我真正想要发生的是服务器接收到字节数组,然后等待你按“s”,当你按“s”时,应该会弹出一个窗口显示接收到的图像。
如果我只是更改为“更小”(小于 22 mb)的图片,这实际上会发生。
【问题讨论】:
-
我知道代码中有一些不必要或草率的细节,但我希望这不会打扰您
-
我现在已经编辑了它,所以它是更多(如果不是)英文
标签: java image swing sockets jframe