0

我想订阅 Spring 框架 WebSocket 并收到回复。

根据我的目标 WebSocket 服务器,通信是使用 STOMP 发布协议完成的(基于 Java Springframework API 构建)https://stomp.github.io/stomp-specification-1.1.html

现在我正在处理的客户端是基于 PHP 构建的,并使用https://github.com/Textalk/websocket-php/作为 websocket 客户端。

我接收服务器响应的想法是根据这个人的回答Websocket Client not received any messages遵循 STOMP over Websocket 技术。

使用当前的 websocket 客户端,我执行这些步骤

  1. 发送连接(请求?)

  2. 发送订阅

  3. 主动接收回复

     $client = new WebSocket\Client($ws_url);
     //Step 1 Inintate connection;
     $open_msg = "CONNECT\naccept-version:1.0,1.1,2.0\n\n\x00\n";
     //Step 2 Subscribe Request;
     $client->send($open_msg);
     $subs = "SUBSCRIBE\nid:0\ndestination:/user/queue\nack:auto\n\n\x00\n";
     $client->send($subs);
     while (true) {
           try {
               $message = $client->receive();
               echo $message;
               // Act[enter image description here][4] on received message
               // Later, Break while loop to stop listening
           } catch (\WebSocket\ConnectionException $e) {
               // Possibly log errors
           }
         }
     $client->close();
    

连接(步骤 1)已完成并经过测试。

当前发送和接收结果图像

由于它在循环上运行,因此Received始终打印。

有谁知道为什么 API 没有发送回复?

4

1 回答 1

0

事实证明,我必须改为实现其他 Websocket 库

我没有使用https://github.com/Textalk/websocket-php/,而是继续使用https://github.com/ratchetphp/Pawl

我不知道刚刚发生了什么。但我认为 Textalk 是同步 websocket 库,而 ratchet 是异步 websocket 库。

我目前的假设是,每当您想通过 websocket 进行 Stomp 时,请确保

  1. 发送连接消息(“CONNECT\naccept-version:1.0,1.1,2.0\n\n\x00\n”)
  2. 发送订阅 ("SUBSCRIBE\nid:0\ndestination:/user/queue\nack:auto\n\n\x00\n")
  3. 使用异步 Websocket 而不是同步的

祝你今天过得愉快

于 2021-07-05T08:55:32.383 回答