协议消息包含无效标记0

时间:2017-12-31 22:48:27

标签: java protocol-buffers

我的目标是创建一个实时服务警报供稿并将其发送到我使用HTTP发布请求的Java服务器。我做的第一步是创建这里发布的示例警报提要的副本,似乎我已经成功地做到了,因为我能够将其打印出来。 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(); 
     }

1 个答案:

答案 0 :(得分:0)

您正在处理服务器上的原始套接字,但有效内容在http请求正文中进行编码。您将需要将http请求解析到有效负载,并且当您拥有正文时 :将其发送到protobuf。现在,您正在将http标头发送到protobuf,这没有意义。这可能意味着要解析为\r\n\r\n,但如果您可以使用内容长度标头会有所帮助,如果您可以使用预先构建的http库,则会更好。