Веб-камера UDP (JAVA)

-4

сервер

try {
DatagramSocket socket = new DatagramSocket(4242);

byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

WebcamPanel panel = new WebcamPanel();

JFrame window = new JFrame("Test webcam panel");
window.add(panel);
window.setSize(500, 500);
window.setResizable(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);

while(true){
socket.receive(packet);
System.out.println("received");
byte[] buff = packet.getData();
ByteArrayInputStream bain = new ByteArrayInputStream(buff);
panel.DrawImage(ImageIO.read(bain));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

клиент

try{
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");

Webcam webcam = Webcam.getDefault();
webcam.setViewSize(WebcamResolution.VGA.getSize());

WebcamPanel panel = new WebcamPanel(webcam);
panel.setFPSDisplayed(true);
panel.setDisplayDebugInfo(true);
panel.setImageSizeDisplayed(true);
panel.setMirrored(true);

JFrame window = new JFrame("Test webcam panel");
window.add(panel);
window.setResizable(true);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

while(true){
ImageIO.write(webcam.getImage(),"jpg", baos);
baos.flush();
byte[] image_buffer = baos.toByteArray();
System.out.println(image_buffer.length);
DatagramPacket packet = new DatagramPacket(image_buffer, image_buffer.length, address, 4242);
socket.send(packet);

}

}catch(Exception e){
e.toString();
}

console-> клиент:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
20884
41796
62687
83582

console-> сервер:

received
received
received

Сервер не может получить целые данные. И Он получил три данных и остановился. Я не понимаю, почему сервер остановился. Webcampanel в клиенте проверяет веб-камеру. Он работает хорошо, но не может отправить изображение. Как получать целые данные непрерывно? пожалуйста, проблема.

спросил(а) 2021-01-19T20:23:53+03:00 2 месяца, 3 недели назад
1
Решение
87

Вы объявляете пакет из 1024 bytes

byte[] buffer = new byte[1024];

На вашем сервере вы читаете каждый пакет и рассматриваете его как целое. Изображение:

byte[] buff = packet.getData(); // This is not a whole image yet
ByteArrayInputStream bain = new ByteArrayInputStream(buff);
panel.DrawImage(ImageIO.read(bain));

Например, первое изображение имеет длину 20884 поэтому для восстановления изображения требуется не менее 20884/1024 + 1 пакетов.

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

Чтобы получить все пакеты и восстановить изображение, вам нужно знать, как определить конец файла на сервере.

Но технически протокол UDP является ненадежным, вы можете потерять некоторые пакеты, ваш принятый пакет будет не таким же, как при его отправке. Так что это очень сложно сделать с UDP.

Я предлагаю использовать TCP для передачи файлов. Это надежный, пакетный заказ гарантирован.

ответил(а) 2021-01-19T20:23:53+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема