как отправить массив байтов по соединению TCP (программирование Java)

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

byte[] myByteArray

(Я плохо знаком с программированием Java и, может казаться, не нахожу пример того, как сделать это, которое показывает оба конца соединения (отправитель и получатель.), Если Вы знаете о существующем примере, возможно, Вы могли бы отправить ссылку. (Никакая потребность изобрести велосипед.) P.S. Это не домашняя работа!:-)

25
задан Mark Roberts 21 May 2010 в 00:45
поделиться

5 ответов

Классы InputStream и OutputStream в Java изначально обрабатывают массивы байтов. Единственное, что вы можете добавить, - это длину в начале сообщения, чтобы получатель знал, сколько байтов ожидать. Обычно мне нравится предлагать метод, который позволяет контролировать, какие байты в массиве байтов следует отправлять, во многом аналогично стандартному API.

Примерно так:

private Socket socket;

public void sendBytes(byte[] myByteArray) throws IOException {
    sendBytes(myByteArray, 0, myByteArray.length);
}

public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
    if (len < 0)
        throw new IllegalArgumentException("Negative length not allowed");
    if (start < 0 || start >= myByteArray.length)
        throw new IndexOutOfBoundsException("Out of bounds: " + start);
    // Other checks if needed.

    // May be better to save the streams in the support class;
    // just like the socket variable.
    OutputStream out = socket.getOutputStream(); 
    DataOutputStream dos = new DataOutputStream(out);

    dos.writeInt(len);
    if (len > 0) {
        dos.write(myByteArray, start, len);
    }
}

РЕДАКТИРОВАТЬ : Чтобы добавить принимающую сторону:

public byte[] readBytes() throws IOException {
    // Again, probably better to store these objects references in the support class
    InputStream in = socket.getInputStream();
    DataInputStream dis = new DataInputStream(in);

    int len = dis.readInt();
    byte[] data = new byte[len];
    if (len > 0) {
        dis.readFully(data);
    }
    return data;
}
56
ответ дан 28 November 2019 в 18:17
поделиться

Просто начните с этого примера из Really Big Index . Обратите внимание, что он предназначен для передачи и приема символов, а не байтов. Однако это не имеет большого значения - вы можете просто иметь дело с необработанными объектами InputStream и OutputStream , которые предоставляет класс Socket . См. API для получения дополнительной информации о различных типах читателей, писателей и потоков. Вам будут интересны методы OutputStream.write (byte []) и InputStream.read (byte []) .

4
ответ дан 28 November 2019 в 18:17
поделиться

Вам необходимо использовать метод write для java.io.OutputStream и метод read для java.io.InputStream , оба из которых вы можете получить из открываемого Socket .

1
ответ дан 28 November 2019 в 18:17
поделиться

Учебник Oracle Socket Communications Tutorial кажется подходящей отправной точкой.

Обратите внимание, что это будет дополнительная проблема для превращения символов в байты. Если вы хотите работать на уровне байтов, просто отделите это.

2
ответ дан 28 November 2019 в 18:17
поделиться

Этот учебник по Sun Sockets должен дать вам хорошую отправную точку

1
ответ дан 28 November 2019 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: