![](/img/trans.png)
[英]Trying to send and receive message using protobuf in java,but got error: Protocol message contained an invalid tag (zero)
[英]Protocol message contained an invalid tag 0
我的目标是创建一个实时服务警报提要,并将其发送到我用Java发布的带有HTTP发布请求的服务器上。 我要做的第一步是创建此处发布的示例警报提要的副本,由于能够将其打印出消息,因此我似乎能够成功做到这一点。 https://developers.google.com/transit/gtfs-realtime/examples/alerts
我要做的下一步是创建HTTP连接,并通过POST请求发送供稿。 这是我的客户代码中的内容,此处的示例是Feed名称。
String url = "https://localhost:8080";
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
//add reuqest header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setRequestProperty("Content-Type", "application/x-protobuf");
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
example.build().writeDelimitedTo(wr);
wr.flush();
wr.close();
到目前为止,我的服务器代码就是这样。
ServerSocket server = new ServerSocket(8080);
System.out.println("Listening for connection on port 8080 ....");
while (true) {
try (Socket socket = server.accept()) {
FeedMessage feed = FeedMessage.parseDelimitedFrom(socket.getInputStream());
Date today = new Date();
String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
socket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
}
}
这里的问题是我在服务器端收到的协议消息包含无效标记0。 在解决此问题上,我需要一些帮助。 也许我没有正确解析它。
更新#2
我已经尝试解析HTTP标头来获得有效负载,如评论所说。 但是我的代码挂起了,在终端上打印标题的输出看起来已经序列化了。
DataInputStream isr = new DataInputStream(socket.getInputStream());
Reader reader = new InputStreamReader(isr);
BufferedReader reader2 = new BufferedReader(reader);
String line = reader2.readLine();
System.out.println("get lines");
while (!line.isEmpty()) {
System.out.println(line);
line = reader2.readLine();
}
您正在服务器上处理原始套接字,但是有效负载已编码在http请求正文中。 您将需要解析http请求到有效负载,并且当您只有body时 :将其发送到protobuf。 现在,您正在将http标头发送到protobuf,这没有任何意义。 这可能意味着解析到\\r\\n\\r\\n
,但是如果您可以使用content-length标头,则将有所帮助,如果可以使用预构建的http库,则更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.