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")
- 对于websockets库:
- Header传递方式差异:不同库的Header传递格式可能有区别,检查websocket-client的header参数是否需要列表形式(比如
header=[f"Authorization: {auth_token}"]),而不是字典。有些WebSocket客户端库要求header是字符串列表而非键值对字典。 - 连接建立后的状态验证:服务端可能在连接建立后需要先返回初始响应,确保连接完全就绪后再发送订阅消息。可以在发送订阅消息前先接收一次服务端的响应,确认连接状态。
- 抓包对比请求细节:用抓包工具(如Wireshark、Fiddler)对比Postman和Python代码发送的WebSocket请求,检查请求头、消息类型、消息内容是否完全一致,重点确认Authorization头的传递是否正确。
内容的提问来源于stack exchange,提问作者Pandarian Ld
相关产品推荐
相关产品推荐

