Каким образом можно отправить изображение от клиента Java к серверу Qt с помощью сокета?

  • 6 августа 2023 г. 17:51
Ответы на вопрос 4
Взаимодействие между клиентом Java и сервером Qt по сути может быть двух видов: передача изображения через сокет как массива байт или как файла. Ниже приведены примеры для обоих методов.

Итак, вам нужно:

1) Преобразовать изображение в массив байт в Java. 

```java
public byte[] getBytesFromImage(String imagePath) throws IOException {
    BufferedImage bufferedImage = ImageIO.read(new File(imagePath));
    ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "png", byteOutStream);
    return byteOutStream.toByteArray();
}
```

2) Отправить массив байт через сокет в Java. Блок кода ниже может послужить примером того, как это можно сделать.

```java
Socket socket = new Socket("localhost", 12345);
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

byte[] bytes = getBytesFromImage("path_to_your_image");
dOut.writeInt(bytes.length);
dOut.write(bytes);
```

3) На стороне сервера в Qt вам следует принять данные и преобразовать их обратно в изображение.

```cpp
QTcpServer *server = new QTcpServer;
QTcpSocket *socket = server->nextPendingConnection();
QByteArray data;

while (socket->waitForReadyRead())
{
    data.append(socket->readAll());
}

QImage image;
image.loadFromData(data, "PNG");
```

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

Обратите внимание, что вы должны указать формат изображения при его записи и чтении (в примере выше мы используем "PNG"). Если вы не уверены, какой формат изображения вы получите, вам следует отправить эту информацию отдельно перед самим изображением.
Понял свою ошибку, ранее я работал со строкой, вместо этого нужно было правильно перейти к числам. Благодарю всех за помощь.
QByteArray messageData;
while (socket->bytesAvailable()) {
    QString qq = socket->readLine();
    qq.remove(qq.size() - 2, 2);
    qint32 s = (qq).toInt(); // Следует обратить внимание на то, что нужно работать с числами, а не со строками
    QByteArray data = QByteArray::number(s, 16);
    qDebug() << data;
    messageData.append(s);
}
При обработке данных, необходимо учитывать, что строки нужно преобразовывать в числа. Спасибо всем за помощь
Похожие вопросы