我有在 Tomcat 服务器上运行的 java 应用程序。它可以与 Android/iOS/Web 应用程序正常工作。使用用户名和密码登录后,服务器将生成一个令牌,应用程序使用该令牌与服务器建立 websocket 连接,以从服务器接收和向服务器发送消息。
要接收来自服务器的广播,应用程序需要向服务器发送一条消息,告知他们想要订阅的消息代码。
现在,我想实现Python(版本3.9.6)应用程序来从服务器接收和发送消息。为了首先简单起见,我通过使用邮递员和硬编码令牌登录来跳过登录过程。
在第一次尝试中,我使用库
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()
仍然无法工作。我在 Java 应用程序中进行了调试,但它没有收到来自客户端的任何消息(两种情况)。
我使用 Postman 使用相同的 url、令牌和二进制消息尝试了相同的流程,并且它有效。我不知道我的代码出了什么问题。
终于找到解决办法了。我使用第二个代码,它使用
websocket-client
库。添加 websocket.ABNF.OPCODE.BINARY
就可以了!
ws.send("A_BINARY_MESSAGE", websocket.ABNF.OPCODE_BINARY)