Qt 中未收到订阅消息

问题描述 投票:0回答:1

我正在测试 Spring Boot 服务器和 Qt 桌面程序之间的 STOMP 通信。 服务器实现如下所示:

@Controller
class GreetingController {

     @MessageMapping("/hello")
     @SendTo("/topic/greetings")
     @Throws(Exception::class)
     fun greeting(@RequestBody message : HelloMessage) : Greeting  {
         Thread.sleep(1000); // simulated delay
         return Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!")
     }
}

Qt 程序如下所示:

bool StompClient::sendFrame(std::shared_ptr<StompFrame> stompFrame) {
     if (!stompFrame->isBinaryBody()) {
         QString str = stompFrame->convertToQString();
         m_Socket.sendTextMessage(str);
         qDebug() << "Send stomp frame " << str;
         return true;
    }

    QByteArray ba = stompFrame->convertToByteArray();
    m_Socket.sendBinaryMessage(ba);
    return true;
 }

 std::shared_ptr<StompFrame> StompFrameCreator::createSubscribeFrame(const QString&   destination) {
     auto stompFrame = std::make_shared<StompFrame>();
     stompFrame->setCommand(StompFrame::HeaderTypes::SUBSCRIBE);
     stompFrame->addHeader("destination", destination);
     return stompFrame;
}

std::shared_ptr<StompFrame> StompFrameCreator::createSendTextFrame(const QString& destination, const QString& message) {
     auto stompFrame = std::make_shared<StompFrame>();
     stompFrame->setCommand(StompFrame::HeaderTypes::SEND);
     stompFrame->addHeader("destination", destination);
     stompFrame->addHeader("content-type", "application/json");
     stompFrame->addTextBody(message);
     return stompFrame;
 }

void StompDemoView::sendGreeting() {
     qDebug() << "Send greeting";
     StompFrameCreator stompFrameCreator;

     QJsonObject jsonObject;
     jsonObject.insert("name", QJsonValue::fromVariant(m_NameLineEdit->text()));
     QJsonDocument doc(jsonObject);

     auto publishFrame = stompFrameCreator.createSendTextFrame("/app/hello", doc.toJson());
     qDebug() << "Sending " << doc.toJson();
     m_StompClient.sendFrame(publishFrame);
 }

void StompDemoView::clientConnected() {
    StompFrameCreator stompFrameCreator;
    qDebug() << "Subscribe to topic";
    auto subscribeFrame = stompFrameCreator.createSubscribeFrame(0, "/topic/greetings", "auto");
    m_StompClient.sendFrame(subscribeFrame);
}

当客户端连接到服务器时,我正在发送订阅请求。服务器正在接收此信息:

 Decoded SUBSCRIBE {id=[0], destination=[/topic/greetings], ack=[auto]} session=null
 From client: SUBSCRIBE /topic/greetings id=0 session=6cc3a2b6-48a5-1c1c-2366-d746224d60e8
 Processing SUBSCRIBE /topic/greetings id=0 session=6cc3a2b6-48a5-1c1c-2366-d746224d60e8

然后,当用户在 GUI 中执行特定操作时,我将消息发送到 Greeting 控制器,该控制器应向订阅客户端发回消息:

  Decoded SEND {destination=[/app/hello], content-type=[application/json]} session=null         application/json payload={
"name": "Cris"

}

  From client: SEND /app/hello session=6cc3a2b6-48a5-1c1c-2366-d746224d60e8 application/json payload={
 "name": "Cris"

}

  Searching methods to handle SEND /app/hello session=6cc3a2b6-48a5-1c1c-2366-d746224d60e8 application/json payload={
"name": "Cris"
 }
 , lookupDestination='/hello'
 Found 1 handler methods: [{[MESSAGE],[/hello]}]
 Invoking GreetingController#greeting[1 args]
 Arguments: [HelloMessage@3903b632]
 Processing return value with SendToMethodReturnValueHandler [annotationRequired=true]
 Processing MESSAGE destination=/topic/greetings session=6cc3a2b6-48a5-1c1c-2366-d746224d60e8 payload={"content":"Hello, Cris!"}
 Broadcasting to 1 sessions.

但我没有收到客户端的任何信息。我为通信中使用的 QWebSocket 信号创建了 binMessageReceived、textMessageReceived、binaryFrameReceived、textFrameReceived、errorOccured 信号槽。

有人可以给我指出正确的方向吗?

spring-boot qt stomp
1个回答
0
投票

使用wireshark和javascript stomp客户端比较客户端和服务器之间交换的websocket消息后,我得出的结论是Qt客户端没有向服务器发送CONNECT Stomp Frame。这就是为什么服务器没有发送与订阅相对应的消息,尽管客户端之前已经发送了 SUBSCRIBE 包。

这是连接到 QWebSocket 的 socketConnected 插槽的插槽中的代码:

StompFrameCreator stompFrameCreator;
auto connectFrame = stompFrameCreator.createConnectFrame("1.2", "", "", "", 10000, 10000);
//auto subscribeFrame = stompFrameCreator.createSubscribeFrame("/topic/greetings");
m_StompClient.sendFrame(connectFrame); 

添加后,在将订阅发送到服务器之前,客户端会从服务器接收与订阅相关的消息。

© www.soinside.com 2019 - 2024. All rights reserved.