我正在尝试将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代码。其余都不变。