Переместить изображения с клиента на сервер, используя 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();
}
}
}
На сервере Вы должны создать разные потоки для разных клиентских сокетов, чтобы вы могли одновременно загружать изображения с разных клиентов.
Надеюсь, приведенный выше пример поможет вам.