【问题标题】:move the images from client to server using java使用java将图像从客户端移动到服务器
【发布时间】:2016-02-09 22:39:13
【问题描述】:

我正在创建一个桌面客户端服务器应用程序,我在其中捕获由渲染器渲染的 jpg 图像中的帧并将它们存储在客户端。 现在我需要将图像上传到服务器。 我试过这个 为每个捕获的图像放置一个单独的线程以将其直接上传到服务器,但这非常耗时。我也尝试在捕获停止后从客户端上传所有图像,但这不是我想要的。

那么有没有办法将直接捕获的图像有效地上传到服务器。

为了捕捉图像,我使用了 BufferedImage 和 ImageIO.write 方法

提前致谢

【问题讨论】:

  • 你如何将每个帧[图像]从客户端上传到服务器,我的意思是使用哪种协议?
  • 如何将图像发送到服务器?可以发一下代码吗?
  • 我有兴趣发送部分。它是套接字还是servlet或其他东西?如果您正在发送,您可以微调缓冲区大小(8192 或一些大数字)并按照此帖子发送:stackoverflow.com/questions/32251895/…
  • 好的,谢谢@ravindra,我会尝试使用套接字
  • @dev 我正在使用http协议上传图片

标签: java image-upload


【解决方案1】:

通过套接字上传图片是在服务器上上传图片最快的方式,因为数据将作为字节流传递给服务器。

下面是简单的Socket Client和Socket Sever实现图片上传

客户

 public class ImageUploadSocketClient {
   public static void main(String[] args) throws Exception {
    Socket socket = new Socket("localhost",6666);
    OutputStream outputStream = socket.getOutputStream();
    BufferedImage image = ImageIO.read(new File("path to image /your_image.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();
    socket.close();
  }
}

服务器

public class ImageUploadSocketRunnable implements Runnable{       
    public static final String dir="path to store image";
    Socket soc=null;
   ImageUploadSocketRunnable(Socket soc){
     this.soc=soc;
   }
    @Override
    public void run() {
    InputStream inputStream = null;
       try {
           inputStream = this.soc.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(dir+System.currentTimeMillis()+".jpg"));
           inputStream.close();
       } catch (IOException ex) {
           Logger.getLogger(ImageUploadSocketRunnable.class.getName()).log(Level.SEVERE, null, ex);
       }

    }

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(13085);
        while(true){
        Socket socket = serverSocket.accept();
        ImageUploadSocketRunnable imgUploadServer=new ImageUploadSocketRunnable(socket);
        Thread thread=new Thread(imgUploadServer);
        thread.start();
        }
    }

}

在服务器端你应该为不同的客户端socket创建不同的线程,这样你就可以实现不同客户端的并发图片上传。

希望以上示例对您有所帮助。

【讨论】:

  • 感谢开发者,这帮助我上传了单张图片,但正如我所提到的,我要上传多张图片,我正面临着连接重置问题
  • 是的,我在单线程中上传它。实际上我想在一个连接中发送多个图像文件,因为为每个图像创建连接是不可行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2017-05-26
相关资源
最近更新 更多