Как отправить bytearray на указанный c получатель - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть TCP-сервер и клиент в Java. Сервер может отправлять команды Клиенту, Клиент затем выполняет команду, например: отправляет изображение на Сервер.

Я отправляю данные с помощью байтового массива, и это работает.

Но давайте представим, что я хочу отправить изображение и файл отдельно. Как Сервер должен знать, какой правильный байтовый массив? Или если я хочу создать VoiceChat (который должен непрерывно отправлять байтовые массивы) и отдельно отправлять изображение?

То есть мой код отправляет байты:

Клиент. java

    public void writeBytes(byte[] bytes, Socket socket) throws IOException {
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.write(bytes);
        out.flush();
    }

Вот мой код для получения и преобразования их в изображение:

Сервер. java

    public BufferedImage writeScreenshot(Socket socket, int length) throws IOException {
        DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        byte[] buffer = new byte[length];
        in.readFully(buffer);

        return ImageIO.read(new ByteArrayInputStream(buffer));
    }

1 Ответ

0 голосов
/ 10 апреля 2020

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

Быстрый и простой протокол - это то, где вы сначала отправляете длину данных, которые вы собираетесь отправить, и затем данные:

    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    out.writeInt(bytes.length);
    out.write(bytes);
    out.flush();

Теперь получатель должен прочитать поле длины:

    DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    int length = in.readInt()
    byte[] buffer = new byte[length];
    in.readFully(buffer);

Когда вы получаете такие приложения, как голосовой чат, протокол должен усложняться. Каждое сообщение должно иметь метаданные, например, какой тип данных он содержит: изображение или голос или что-то еще. Также вы, вероятно, не захотите разрабатывать этот протокол с нуля, а использовать что-то, что уже существует - например, протокол потоковой передачи в реальном времени (RTSP) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...