Protobuf Java 方法 parseFrom() 在从 MQTT 服务器接收消息时挂起

Protobuf Java method parseFrom() hangs when receiving message from MQTT Server

我目前正在尝试通过 Mosquitto MQQT 服务器发布和接收 Protobuf 消息。我成功地将权利发布到服务器。但是,当客户端收到它时,方法 parseFrom() 挂起并且永远不会 returns。这是一个与 this one 非常相似的问题,发生在通过从未关闭的套接字发送 Protobuf 消息时。

发布者:

MqttClient adapterClient = new MqttClient(broker, clientID);
SpecsMessage.Specs protoNotifyMessage = SpecsMessage.Specs.newBuilder()
                    .setNodeType("basic")
                    .setAddress(serverSocket.getInetAddress().getHostName())
                    .setPort(serverSocket.getLocalPort())
                    .build();
MqttMessage notifyMessage = new MqttMessage(protoNotifyMessage.toString().getBytes());
adapterClient.publish("availableNodes", notifyMessage);

订户:

public class TestController implements MqttCallback {
  public void messageArrived(String topic, MqttMessage message){
                System.out.println("New node connected");     
                System.out.println("Payload: \n" + new String(message.getPayload()));                           
                SpecsMessage.Specs protoMessage = SpecsMessage.Specs.parseFrom(message.getPayload());
  }
}

我找不到向 MQQT 服务器指定发送消息的正确方式的方法。

我也试过使用 writeDelimitedFrom() 方法。

MqttClient adapterClient = new MqttClient(broker, clientID);
SpecsMessage.Specs protoNotifyMessage = SpecsMessage.Specs.newBuilder()
                    .setNodeType("basic")
                    .setAddress(serverSocket.getInetAddress().getHostName())
                    .setPort(serverSocket.getLocalPort())
                    .build();
ByteArrayOutputStream output = new ByteArrayOutputStream();
protoNotifyMessage.writeDelimitedTo(output);
MqttMessage notifyMessage = new MqttMessage(output.toByteArray());
adapterClient.publish("availableNodes", notifyMessage);

但是,消息未在 byte[] 中正确转换,如下所示:

nodeType: "basic"
address: "0.0.0.0"
port: 43101

这是我得到的:

basic0.0.0.0��

有没有办法通过更正发送方法或解决 byte[] 转换问题来实现此功能?

您正在尝试使用 parseFrom 来解析文本格式的原型。 parseFrom 用于解析有线格式。

改为以有线格式发送原型 - message.toByteArray()

(如果要从文本格式解析,使用TextFormat)。