从C ++服务器向Java客户端发送png

时间:2019-02-28 20:18:41

标签: java android c++

我正在尝试将png图像从C ++服务器发送到Java(Android Studio)客户端(图像保存在服务器上)。我读到我需要在base64中对图像进行编码,发送,解码,将其转换为字节数组,然后转换为位图。 (在这一点上,我可能应该提到我对android studio还不那么熟悉)。老实说,我什至不知道我是否需要做所有这些,这就是我在互联网上找到的...

无论如何,所以我开始这样做,这就是我得到的: (这是c ++服务器的一部分,Message是我制作的类,它处理了socketing-magic的一部分。另外,我应该提到的大多数功能不是我制作的。不必担心协议的外观就像在sendImage中一样,我只是添加了它,以便您可以查看图像的发送方式。我使用https://github.com/tkislan/base64进行base64编码)

void MessageHandler::handleSendPicture(Message & msg)
{
    SOCKET& socket = msg.getSocket();
    char* image;
    std::ifstream f;     
    f.open("C:\\images\\A.png", ios::binary);


    if (f.is_open())
    {
        f.seekg(0, std::ios::end);
        unsigned int length = f.tellg();
        f.seekg(0, std::ios::beg);

        image = new char[length];
        f.read(image, length);

        f.close();
    }

    else
    {
        image = (char*)"Empty";
    }

    Message to_client = Message(msg.getSocket(), SEND_PIC, image);
    to_client.sendImage();
}


void Message::sendImage(unsigned int size, char* image)
{
    string prefix = "04" + getPaddedNumber(size, 5);
    string message = prefix;

    for (unsigned int i = 0; i < size; i++)
    {
        message += image[i];
    }

    const char* data = message.c_str();
    cout << "message size: " << message.size() << endl;
    if (send(this->_socket, data, message.size(), 0) == INVALID_SOCKET)
    {
        throw std::exception("Error while sending message to client");
    }
}

在(Java)应用程序方面:(不必担心startOperation,它只处理网络魔术,client._fromServer.firstElement()也是从服务器发送的图像字符串)

case R.id.translate_word:
                if (startOperation("SendPicture"))
                {
                    byte[] byteArray = Base64.getDecoder().decode(client._fromServer.firstElement());
                    Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
                    ImageView image = (ImageView) findViewById(R.id.sign);

                    image.setImageBitmap(Bitmap.createScaledBitmap(bmp, image.getWidth(), image.getHeight(), false));
                    client._success = false;
                }

当客户端要求提供图片时,服务器崩溃,并且在Base64 :: Encode行上确实发生了服务器崩溃。我也真的不知道该如何工作,很抱歉我是菜鸟。 所以,我想问是否还需要所有这些?有没有更简单的方法可以做到这一点?我什至这样做对吗?可能是base64转换器吗?提前非常感谢<3非常爱:)

编辑:初始化了new_message字符串,现在服务器没有崩溃,但是客户端没有任何反应...它确实得到了响应,但是没有反应

Edit2:我设法从服务器正确地发送了消息(或者至少我认为是这样),问题是二进制文件中的0被读取为空终止符。无论如何,当我在客户端中收到消息时,仅收到28642个字节(30965个字节)。有人知道怎么了吗? (我现在也放弃了base64编码)。更新了上面的sendImage代码。其余都不变。

0 个答案:

没有答案