Поток ввода-вывода приложения Java Video Chat не работает

#java #networking #video #datainputstream #dataoutputstream

#java #сеть #Видео #поток ввода данных #dataoutputstream

Вопрос:

Я создаю приложение для видеочата, которое использует Java networking (aka. sockets) для отправки изображений веб-камеры другому клиенту.

Мой код отправляет сначала длину буферизованных данных изображения, а затем фактические данные. Сервер также сначала считывает int, а затем сами данные. Первое изображение сработало, но после него поток ввода данных прочитал отрицательное число в качестве длины.

На стороне сервера:

 frame = new JFrame();
        while (true) {
            try {

                length = input.readInt();
                System.out.println(length);
                imgbytes = new byte[length];
                input.read(imgbytes);
                imginput = new ByteArrayInputStream(imgbytes);
                img = ImageIO.read(imginput);
                frame.getContentPane().add(new JLabel(new ImageIcon(img)));
                frame.pack();
                frame.setVisible(true);

            }
            catch(IOException e){
            e.printStackTrace();
            }
        }
  

На стороне клиента:

 while(true) {
            try {

                    currentimg = webcam.getImage();
                    ImageIO.write(currentimg, "jpg", imgoutputstream);
                    imgbytes = imgoutputstream.toByteArray();
                    out.writeInt(imgbytes.length);
                    out.write(imgbytes);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
  

Комментарии:

1. Вы запускаете бесконечный цикл без прерывания на стороне клиента. Что заставит вас прервать внутренний цикл while, чтобы прочитать новое изображение с веб-камеры внутри внешнего цикла?

2. Я исправил ошибку, но она по-прежнему не работает. Я добавил отладку System.out.println() на стороне сервера для печати длины, и вот результат 4465 8917 13388 17869 22323 26786 31233 35694 40168 44637 49116 53596 58062 62546 67038 -657982985 Exception in thread "main" java.lang.NegativeArraySizeException at ServerSide.ServerWorker.run(ServerWorker.java:39) at ServerSide.Server.<init>(Server.java:42) at ServerSide.ServerMain.main(ServerMain.java:7)

Ответ №1:

На стороне клиента вы всегда записываете новое изображение в существующий поток. Это приводит к увеличению размера массива на каждой итерации. В Java int имеет максимум 2147483647 . Если вы увеличите это целое число, оно перейдет к минимальному значению, int которое является отрицательным (см. Эту статью).

Итак, чтобы исправить эту ошибку, вам нужно очистить свой поток перед записью следующего изображения, чтобы размер никогда не превышал максимальное значение integer.