Websocket客户端未收到任何消息

Posted

技术标签:

【中文标题】Websocket客户端未收到任何消息【英文标题】:Websocket Client not receiving any messages 【发布时间】:2020-05-13 17:58:30 【问题描述】:

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

客户

# 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);
        

当我检查上述变量的值时,我发现目的地与预期的一样queue/alerts。我也有 java 客户端来测试,它工作得很好。我什至通过订阅/topic/alerts 并通过template.convertAndSend(/topic/alerts) 发送给它来尝试这个,在这里我也没有收到任何东西。我对此一无所知,希望能提供任何帮助!

【问题讨论】:

我尝试了与***.com/questions/34574349/sockjs-python-client相同的步骤,但它不起作用,有人可以帮忙吗? 【参考方案1】:

经过几天的拔毛,我终于找到了原因和解决方法!

    我使用的java客户端是 WebSocketStompClient stompClient = new WebSocketStompClient(transport);.stompClient.connect(URL, webSocketHttpHeaders, sessionHandler); 方法隐式发送一个 stomp CONNECT\n\n\x00\n 已为 STOMP 配置的 Springboot 服务器将此理解为连接请求,并以 CONNECT_ACK 响应。 发送此 ACK 时,它还会使用新用户更新其本地 UserRegistry。所以内部消息代理知道有用户订阅了某某主题。 在我的 Python 代码中,我只是打开了一个 Websocket 连接,然后直接发送了一个SUBSCRIBE 消息。所以经纪人从来没有得到CONNECT,所以用户从来没有被存储!这导致稍后发布的消息仅被代理丢弃。 修复是在打开连接后订阅前发送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)

【讨论】:

我有点怀疑这是我的问题,因为虽然我得到了连接,但它并没有“注册”为 STOMP 客户端 对不起,你在第 1 点的意思是什么,方法隐式发送一个 stomp CONNECT\n\n\x00\n?我该如何设置?或者你也可以展示你的 Spring Boot 代码吗? 不可以设置,一旦调用stompClient.connect(URL, webSocketHttpHeaders, sessionHandler); 方法,该方法在建立websocket连接后会发送CONNECT消息。请注意,这在 Stomp Java 客户端中。这也需要发送,以便springboot服务器可以使用这个客户端更新它的注册表并发送回CONNECT_ACK。 @srinivaskumar 好的,但我使用 Spring 作为客户端和 Python 作为服务器,但我无法发送正确的消息来连接 Spring Boot 的 stompClient。它永远不会进入 afterConnected() 方法或任何东西。 也许,你可以分享你的代码,我可以看看。 @CptDayDreamer

以上是关于Websocket客户端未收到任何消息的主要内容,如果未能解决你的问题,请参考以下文章

使用rabbitmq广播模式来处理集群下的websocket消息推送

带有异步计时器的 Python 异步 websocket 客户端

在反应中收到消息后立即未定义Websocket

在 Android 中的 Java Websocket 服务器收到消息时,未创建 Toast 消息

Spring(Grails)WebSocket 立即记录错误:SubProtocolWebSocketHandler - *** ms 后未收到消息

SignalR 2.2 客户端未收到任何消息