【问题标题】:Sending an image over a socket通过套接字发送图像
【发布时间】:2013-12-31 08:59:28
【问题描述】:

我最近正在尝试创建一个程序,就像 teamviewer 一样。进展顺利,但我目前面临一个问题。

我正在尝试让我的程序通过套接字发送图像。当我运行这段代码时,它从不输出“应该发送图像!”,所以我认为问题出在 ImageIO.write 行。

BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
try {
    ImageIO.write(screencapture, "jpg", socket.getOutputStream());
    System.out.println("Image should be sent!");
} catch (IOException ex){
    ex.printStackTrace();
} finally {
    if ( socket != null ){
        try { socket.close(); } catch (IOException ex){}
    }
    System.out.println("Image sent and socket closed!");
}

另一端还有一个客户端,正在消费上面代码发送的数据。 执行此操作的代码是:

BufferedImage image = ImageIO.read(socket.getInputStream());
JLabel label = new JLabel(new ImageIcon(image));
f.getContentPane().add(label);

现在我的问题是,这段代码有什么问题,我怎样才能使它工作?

【问题讨论】:

  • 不是答案:你为什么不直接使用 VNC?它基本上是一个没有 NAT 遍历的 Teamviewer(所以如果你想要你自己的 TW,你必须在那里修改它。)但就是这样。 UltraVNC、TightVNC 等等。
  • @Shiki 好吧,我只是想添加其他程序没有的其他功能。有些程序可能有一些我能想到的功能,但没有一个具备全部功能。
  • 我注意到您没有将图像的长度写入套接字(也许您不需要它);其次,我建议用BufferedOutputStream 包装socket.getOutputStream()。最后,我会关闭 OutputStream(并在之前刷新)我关闭了套接字。
  • 您的意思是程序“挂起”在ImageIO.write 的行上,对吧?是否有客户端正在消费 socker 另一端的数据?
  • @rzymek 是的,它挂在那条线上。是的,有一个客户端在使用数据。

标签: java sockets


【解决方案1】:

实际上代码看起来没问题。这是一个完整的代码,在我的机器上运行良好:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.*;

import javax.imageio.ImageIO;
import javax.swing.*;

public class Server {
  public static void main(String[] args) throws Exception {
    BufferedImage screencapture = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
    try (ServerSocket serv = new ServerSocket(25000)) {
      System.out.println("waiting...");
      try (Socket socket = serv.accept()) {
        System.out.println("client connected");
        ImageIO.write(screencapture, "jpg", socket.getOutputStream());
        System.out.println("sent");
      }
    }
  }
}

class Client {
  public static void main(String[] args) throws Exception {
    try(Socket socket = new Socket("localhost", 25000)){
      BufferedImage image = ImageIO.read(socket.getInputStream());
      JLabel label = new JLabel(new ImageIcon(image));
      JFrame f = new JFrame("vnc");
      f.getContentPane().add(label);
      f.pack();
      f.setVisible(true);
    }
  }
}

虽然这仅在您在发送图像后关闭套接字时才有效。如果您只是尝试通过同一个套接字发送一些图像,它将失败。见https://stackoverflow.com/a/6973863/211205

【讨论】:

  • 谢谢老兄,这对我来说非常有效。不得不改变一些小事情,但现在一切都如我所愿。
【解决方案2】:

我之前已经解决了这个问题,并在我的博客中发布了解决方案。请访问它以获取完整的源代码。也需要您的反馈。

您需要读取线程、套接字和图像写入来执行此操作。

http://javabelazy.blogspot.in/2013/10/sending-screenshot-from-client-to.html

BufferedImage screenshot = robot.createScreenCapture(new Rectangle(dimensions));
ImageIO.write(screenshot,"png",serverSocket.getOutputStream());
ImageIO.write(img, "png", new File(fileName+".png"))

【讨论】:

    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2013-12-17
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多