问一个 websockets 的问题

2023-01-15 11:19:24 +08:00
 longmeier90
我用 python 写了一个 websockets 例子, 服务端和客户端在一台服务器上就可以正常通信,
放在不同的服务器就会提示
error:websockets.exceptions.InvalidMessage: did not receive a valid HTTP response 。
是不是网络的问题,不过我服务器防火墙上的端口都打开了。

sever.py 服务端


import asyncio
import websockets

# 检测客户端权限,用户名密码通过才能退出循环
async def check_permit(websocket):
    while True:
        recv_str = await websocket.recv()
        cred_dict = recv_str.split(":")
        print("接受",cred_dict)
        if cred_dict[0] == "admin" and cred_dict[1] == "123456":
            response_str = "congratulation, you have connect with server\r\nnow, you can do something else"
            await websocket.send(response_str)
            return True
        else:
            response_str = "sorry, the username or password is wrong, please submit again"
            await websocket.send(response_str)

# 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
async def recv_msg(websocket):
    while True:
        recv_text = await websocket.recv()
        print("消息:",str(recv_text))
        response_text = f"your submit context: {recv_text}"
        await websocket.send(response_text)

# 服务器端主逻辑
# websocket 和 path 是该函数被回调时自动传过来的,不需要自己传
async def main_logic(websocket, path):
    await check_permit(websocket)

    await recv_msg(websocket)

start_server = websockets.serve(main_logic, '0.0.0.0', 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()



#### client.py 客户端

import asyncio
import websockets

# 向服务器端认证,用户名密码通过才能退出循环
async def auth_system(websocket):
    while True:
        cred_text = input("please enter your username and password: ")
        await websocket.send(cred_text)
        response_str = await websocket.recv()
        if "congratulation" in response_str:
            return True

# 向服务器端发送认证后的消息
async def send_msg(websocket):
    while True:
        _text = input("please enter your context: ")
        if _text == "exit":
            print(f'you have enter "exit", goodbye')
            await websocket.close(reason="user exit")
            return False
        await websocket.send(_text)
        recv_text = await websocket.recv()
        print(f"{recv_text}")

# 客户端主逻辑
async def main_logic():
    async with websockets.connect('ws://(server 公网 ip):8765') as websocket:
        await auth_system(websocket)

        await send_msg(websocket)

asyncio.get_event_loop().run_until_complete(main_logic())


646 次点击
所在节点   WebSocket
2 条回复
julyclyde
2023-01-16 08:32:17 +08:00
在 client 里设置一下 logging 吧
import logging
logging.basicConfig(level=logging.DEBUG)
thinkershare
2023-01-16 20:01:35 +08:00
你这样提问,别人很难告诉你原因,我扫了一下,代码没问题。这个错误就是客户端连接不到服务器。应该是中间的网络环境问题,你先 ping 一下公网 IP ,然后在你的服务器上查看一下当前服务 8765 监听的 IP 地址列表,最后确认一下这个流程的中间是否存在代理和防火墙规则。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/909020

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX