当前位置: 首页 > 知识库问答 >
问题:

我只是使用Java通过socket发送部分图像

葛念
2023-03-14

我使用了代码从这里如下,只得到了一半的图片发送,谁能告诉我原因吗?获取大小和读取大小的代码对我来说太复杂了,所以我搞不清楚。

public class Send {

public static void main(String[] args) throws Exception {
    Socket socket = new Socket("localhost", 13085);
    OutputStream outputStream = socket.getOutputStream();

    BufferedImage image = ImageIO.read(new File("C:\\Users\\Jakub\\Pictures\\test.jpg"));

    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());
    outputStream.flush();
    System.out.println("Flushed: " + System.currentTimeMillis());

    Thread.sleep(120000);
    System.out.println("Closing: " + System.currentTimeMillis());
    socket.close();
}
}


public class Receive {

public static void main(String[] args) throws Exception {
    ServerSocket serverSocket = new ServerSocket(13085);
    Socket socket = serverSocket.accept();
    InputStream inputStream = socket.getInputStream();

    System.out.println("Reading: " + System.currentTimeMillis());

    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));

    System.out.println("Received " + image.getHeight() + "x" + image.getWidth() + ": " + System.currentTimeMillis());
    ImageIO.write(image, "jpg", new File("C:\\Users\\Jakub\\Pictures\\test2.jpg"));

    serverSocket.close();
}
} 

正如@EJP评论的那样,最可能的问题是在receive部分,InputStream.Read(Byte[]byteArray)不能完全加载byteArray。如果我使用dataInputStreamdis=new DataInputStream(inputStream),那么调用dis.readally(byteArray),它将加载byteArray。虽然我不知道inputStream不能工作的原因。希望有人能说明原因,这将是很好的赞赏。修正后的代码如下:

public class Send {

public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 13085);
OutputStream outputStream = socket.getOutputStream();

BufferedImage image = ImageIO.read(new File("test.jpg"));

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());
outputStream.flush();
System.out.println("Flushed: " + System.currentTimeMillis());

Thread.sleep(120000);
System.out.println("Closing: " + System.currentTimeMillis());
socket.close();
}
}

public class Receive {

public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(13085);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream=new DataInputStream(inputStream);

System.out.println("Reading: " + System.currentTimeMillis());

byte[] sizeAr = new byte[4];
dataInputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).getInt();

byte[] imageAr = new byte[size];
dataInputStream.readFully(imageAr);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));

System.out.println("Received " + image.getHeight() + "x" + image.getWidth() + ": " + System.currentTimeMillis());
ImageIO.write(image, "jpg", new File("received.jpg"));

serverSocket.close();
}
}

共有1个答案

夏博
2023-03-14

去掉字节数组流,对套接字流执行ImageIO直接操作。

问题是,您假设read()填充了缓冲区,但如果您按照上面的操作,您将完全删除read()

发送长度也是没有意义的,因为您将关闭他们的套接字之后无论如何。流的结尾足以分隔图像。

也别再睡觉了。网络代码中不需要sleeps。

 类似资料:
  • 问题内容: 我可以将文件作为多部分发送到servlet吗?我正在制作表单并将其作为多部分提交,但是以某种方式我没有收到成功上传它的回复。我不希望刷新页面,因此它必须由ajax进行。 问题答案: 只有使用XHR API(以前称为“ XHR2”或“ XHR Level 2”的一部分,当前称为“ XHR高级功能”)才有可能。 有了这个HTML, 您可以按以下方式上传: XHR将注意适当的头和请求主体编码

  • 我想用Java从我的公司Outlook帐户发送邮件。但它说邮箱无法访问。我试过各种解决方案,比如更改主机名,但还是不行。错误保持不变。请对此提出任何解决方案。下面是我面临的错误片段。注意:我使用javax mail来实现这个目的。

  • 问题内容: 我试图替换在终端中运行的Netcat命令,该命令将重置服务器上的某些数据。netcat命令如下所示: 我一直试图在Java中实现它,因为我希望能够从正在开发的应用程序中调用此命令。我遇到了问题,但命令从未在服务器上执行。 这是我的Java代码: 代码还挂在应读取的while循环上,我不知道为什么。我一直在使用Wireshark捕获数据包,并且输出的数据看起来是相同的: 也许其余的包装袋

  • 我已成功发送多部分pdu短信, 问题是,当我试图将此SMS发送到不同网络上的号码时,它会给我以下错误: 请谁能告诉我我该怎么做。

  • 我会更好地解释我的问题,我会为我糟糕的英语道歉。我在练习java。net包(这是我下一次大学考试的论据),我正试图更好地控制客户端和服务器设备之间的通信。更准确地说,在调用close()方法到相关套接字之前,我尝试使用TCP连接在3个不同的时间内从服务器向客户端发送3个不同的字符串。我发现我的剧本没有我想象的那么好用。在客户端,我接收所有3个字符串,但只有在我关闭套接字时才接收。相反,我希望在将这

  • 然而,当我通过UDP实现它时,我错过了这种方法