Переместить изображения с клиента на сервер, используя Java

Я создаю настольное клиент-серверное приложение, в котором я собираю кадры в виде изображений jpg, визуализируемых рендерером, и сохраняю их на стороне клиента. Теперь мне нужно загрузить изображения на сервер. Я попытался сделать это, разместив отдельный поток для каждого захваченного изображения, чтобы загрузить его непосредственно на сервер, но это было очень много времени. Также я попытался загрузить все изображения с клиента после того, как захват был остановлен, но это не тот случай, который я хочу.

Итак, есть ли способ эффективно загрузить непосредственно захваченные изображения на сервер.

для захвата изображений я использую методы BufferedImage и ImageIO.write

заранее спасибо

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

}

На сервере Вы должны создать разные потоки для разных клиентских сокетов, чтобы вы могли одновременно загружать изображения с разных клиентов.

Надеюсь, приведенный выше пример поможет вам.

Другие вопросы по тегам