Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器无法从protobuf字节[]解析 < >我使用C++客户机的libCURL,以便向java服务器提交帖子数据。 由于某些原因,无法在服务器端解析post数据(protobuf SerializeToString)_Java_Post_Encoding_Protocol Buffers_Libcurl - Fatal编程技术网

Java服务器无法从protobuf字节[]解析 < >我使用C++客户机的libCURL,以便向java服务器提交帖子数据。 由于某些原因,无法在服务器端解析post数据(protobuf SerializeToString)

Java服务器无法从protobuf字节[]解析 < >我使用C++客户机的libCURL,以便向java服务器提交帖子数据。 由于某些原因,无法在服务器端解析post数据(protobuf SerializeToString),java,post,encoding,protocol-buffers,libcurl,Java,Post,Encoding,Protocol Buffers,Libcurl,以下是客户端部分: string str; ProtoBufMessage.SerializeToString(&str); curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str); curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDSIZE, str.size()); 下面是服务器上的Java代码: @Produces(MediaType.APPLICATION_OCTET_ST

以下是客户端部分:

string str;
ProtoBufMessage.SerializeToString(&str);
curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str);
curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDSIZE, str.size());
下面是服务器上的Java代码:

@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
public @ResponseBody
byte[] updateStatus( @RequestBody byte[] message) {
    try {
       ProtobufMessage pbMessage = ProtobufMessage.parseFrom(message);

    ...

}
当我将消息转换为字符串时,得到以下值-%C3%B4%C3%BA%29%00%00%00%00%C3%BD%C3%BD%C3%BD%C2%AB%C2%AB%C2%AB%C2%AB%AB%C2%C2%AB=”

但是,客户端正在发送以下值-“\b\x1\x1a\xe\n\x5Hello\x12\x5world”

我相信这与传输字节的编码有关,但我如何控制它呢

另外,在解析消息时,我在服务器端遇到了一个异常- com.google.protobuf.InvalidProtocolBufferException:协议消息结束组标记与预期标记不匹配。

根据,
CURLOPT\u POSTFIELDS
的参数需要是
char*
。您正在传递一个
std::string
。您不会得到编译错误,因为
curl\u easy\u setopt
是一个c风格的vararg函数,它没有类型检查

将行更改为:

curl_easy_setopt(m_curl_handle, CURLOPT_POSTFIELDS, str.data());
这里还有一个可能的问题,libcurl将使用
内容类型发送请求:application/x-www-form-urlcoded
。许多web服务器会识别这种类型,并尝试将其作为表单数据进行解析。你应该把<代码>内容类型< /C> >覆盖到代码>应用程序/X-ToBuff,或者可能只是<代码>应用程序/八位字节流>代码(这意味着“字节BLB”)以避免任何问题。

我将它改为STRATDATA(),但真正的问题与C++和java之间的序列化有关(所以我最终对BASE64编码了消息)。谢谢