You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python WebSocket send消息无法被Tomcat Java服务端接收

问题描述

我有一个运行在Tomcat服务器上的Java应用,它与Android/iOS/Web应用交互正常。用户使用用户名密码登录后,服务端会生成token,应用通过该token建立WebSocket连接以收发消息。要接收服务端广播,应用需发送消息告知要订阅的消息编码。

现在我想用Python 3.9.6实现与服务端的消息收发,为简化流程,我通过Postman登录并硬编码token。首次尝试使用websockets库编写代码,但未收到服务端广播;改用websocket-client库后仍无效,调试Java应用发现两种情况服务端均未收到消息。但使用相同的URL、token和二进制消息通过Postman测试却正常,我不知代码问题出在哪。

尝试的代码

websockets库实现

import asyncio
import websockets

# Define the WebSocket URL
async def connect_and_listen(url, headers):
    print("called connect_and_listen")
    async with websockets.connect(url, extra_headers=headers) as websocket:
        print("called websockets.connect")
        # Send Subscribe
        try:
            await websocket.send("A_BINARY_MESSAGE")
        except Exception as e:
            print(e)

        print("while true")
        # Loop Receive Broadcast
        while True:
            # Receive data from the WebSocket server
            data = await websocket.recv()
            # Update Excel with the received data using PyXLL functions
            update_excel(data)

def update_excel(data):
    print(data)

url = "ws://localhost:8080/BCST_PATH"
token = "TOKEN"
auth_token = "Bearer " + token
headers = {"Authorization": auth_token}


asyncio.get_event_loop().run_until_complete(connect_and_listen(url, headers))

websocket-client库实现

import websocket

url = "ws://localhost:8080/BCST_PATH"
token = "TOKEN"
auth_token = "Bearer " + token
headers = {"Authorization": auth_token}

ws = websocket.WebSocket()
ws.connect(url, header=headers)

ws.send("A_BINARY_MESSAGE")
print ("Receiving...")
resp = ws.recv()
print ("Receive: %s", resp)
ws.close()

可能的问题排查方向

  • 消息格式不匹配:Postman发送的是二进制消息,但代码里发送的是字符串"A_BINARY_MESSAGE",服务端可能期望接收二进制数据而非文本字符串。尝试将消息转为二进制格式发送:
    • 对于websockets库:await websocket.send(b"A_BINARY_MESSAGE")
    • 对于websocket-client库:ws.send_binary(b"A_BINARY_MESSAGE")
  • Header传递方式差异:不同库的Header传递格式可能有区别,检查websocket-client的header参数是否需要列表形式(比如header=[f"Authorization: {auth_token}"]),而不是字典。有些WebSocket客户端库要求header是字符串列表而非键值对字典。
  • 连接建立后的状态验证:服务端可能在连接建立后需要先返回初始响应,确保连接完全就绪后再发送订阅消息。可以在发送订阅消息前先接收一次服务端的响应,确认连接状态。
  • 抓包对比请求细节:用抓包工具(如Wireshark、Fiddler)对比Postman和Python代码发送的WebSocket请求,检查请求头、消息类型、消息内容是否完全一致,重点确认Authorization头的传递是否正确。

内容的提问来源于stack exchange,提问作者Pandarian Ld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:13:30