gpt4 book ai didi

python - Websocket 客户端没有收到任何消息

转载 作者:行者123 更新时间:2023-12-05 09:11:31 25 4
gpt4 key购买 nike

我有 Python 客户端,它打开到服务器的 websocket 连接并使用 STOMP 协议(protocol)订阅特定主题,订阅进行得很好,正如我在服务器上看到的那样,一切都很好。但是,当服务器发布一些消息时,客户端不会收到任何消息。以下是使用的代码:

客户端

# coding: utf-8
import websocket
import stomp
import stomper
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInByaW5jaXBhbF9uYW1lIjoiYWRtaW4iLCJpc3MiOiJBdGhlbmEiLCJ1c2VydHlwZSI6IkxPQ0FMIiwiYW9zX3ZlcnNpb24iOiJldXBocmF0ZXMtNS4xMS1zdGFibGUiLCJyZWdpb24iOiJlbi1VUyIsImV4cCI6MTczNDI4MDI3NywidXVpZCI6ImI4MzhjOGRkLWI4NmQtNGNkZS05ZTE4LTUxM2E1OTk4ODhhYyIsImlhdCI6MTU3NjYwMDI3NywiYXV0aG9yaXRpZXMiOiJST0xFX0NMVVNURVJfQURNSU4sUk9MRV9NVUxUSUNMVVNURVJfQURNSU4sUk9MRV9VU0VSX0FETUlOLFJPTEVfQ0xVU1RFUl9WSUVXRVIiLCJqdGkiOiI1NTU1ZjEwZC04NGQ5LTRkZGYtOThhNC1mZmI1OTM1ZTQwZWEifQ.LOMX6ppkcSBBS_UwW9Qo2ieWZAGrKqADQL6ZQuTi2oieYa_LzykNiGMWMYXY-uw40bixDcE-aVWyrIEZQbVsvA"
headers = {"Authorization": "Bearer " + token}
uri = "ws://127.0.0.1:8765/notifications/websocket"
def on_msg(ws, msg):
print(msg)

def on_error(ws, err):
print(err)

def on_closed(ws):
print("#Closed#")

def on_open(ws):
sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto")
ws.send(sub)

headers = {"Authorization": "Bearer " + token}



websocket.enableTrace(True)
ws = websocket.WebSocketApp(uri, header=headers, on_message=on_msg, on_error=on_error, on_close=on_closed)
ws.on_open = on_open
ws.run_forever()

代码服务器用于发布消息:

    for (WatchesSubscription s : subscriptions) {
template.convertAndSendToUser(s.getSession().getUser(), destination, dto);
}

当我检查上述变量的值时,我看到目的地符合预期队列/警报。我也有要测试的 Java 客户端,它工作得很好。我什至尝试过订阅 /topic/alerts 并通过 template.convertAndSend(/topic/alerts) 发送给它,在这里我也没有收到任何东西。我对此一无所知,非常感谢任何帮助!

最佳答案

经过多日的纠结,我终于找到了原因和解决方法!

  1. 我使用的 java 客户端是WebSocketStompClient stompClient = new WebSocketStompClient(transport);stompClient.connect(URL, webSocketHttpHeaders, sessionHandler); 方法隐式发送一个 stomp CONNECT\n\n\x00\n
  2. 已为 STOMP 配置的 Springboot 服务器将此理解为连接请求并以 CONNECT_ACK 响应。
  3. 发送此 ACK 时,它还会使用新用户更新其本地 UserRegistry。因此内部消息代理知道有一个用户订阅了某某主题。
  4. 在我的 Python 代码中,我只是打开了一个 Websocket 连接,然后直接发送了一个 SUBSCRIBE 消息。所以代理永远不会得到 CONNECT 所以用户永远不会被存储!这导致稍后发布的消息仅被代理丢弃。
  5. 修复方法是在打开连接之后和订阅之前发送 CONNECT\n\n\x00\n。这是代码:
def on_open(ws):
#The magic happens here!
ws.send("CONNECT\naccept-version:1.0,1.1,2.0\n\n\x00\n")
sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto")
ws.send(sub)

关于python - Websocket 客户端没有收到任何消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59946726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com