python websockets 客户端与服务端


简易 websockets 客户端与服务端

服务端

代码如下(示例):

import asyncio
import websockets

__wstocken = {}

# 通知给所有的客户端
async def notify_users(msg):
    try:
		for key in __wstocken:
			await  __wstocken[key].send(msg)
    except Exception as e:
		print("error: {}".format(e))

# 检测客户端权限,用户名密码通过才能退出循环
async def check_permit(websocket):
    while True:
        recv_str = await websocket.recv()
        cred_dict = recv_str.split(":")
        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, path):
    async for message in websocket:
		print(message)
        response_text = f"your submit context: {message}"
        await websocket.send(response_text)


async def register(websocket, path):
    __wstocken[path] = websocket
	if len(__wstocken) > 80:
		print("------waring wsclient to much")
	print(__wstocken)

#需要以websocket作为主键去查找,无法使用path。有path携带错误的问题
async def unregister(websocket, path):
    del __wstocken[path]
	print(__wstocken)


# 服务器端主逻辑
# websocket和path是该函数被回调时自动传过来的,不需要自己传
async def logic(websocket, path):
    await check_permit(websocket)
	await register(websocket, path)
	tryawait recv_msg(websocket, path)
	except Exception as e:
		print("error: {}".format(e))
	finally:
		await unregister(websocket, path)
		
def wsserver_task(host, port):
	start_server = websockets.server(login, host, port, ping_interval=None)
	asyncio.get_event_loop().run_until_complete(start_server)
	asyncio.get_event_loop().run_forever()
	# 如果要给被回调的logic传递自定义参数,可使用以下形式
	# 修改回调形式
	# import functools
	# start_server = websockets.serve(functools.partial(logic, other_param="test_value"), '10.10.6.91', 5678)
	# 修改被回调函数定义,增加相应参数
	# async def logic(websocket, path, other_param)
	
if __name__ == "__main__":
	wsserver_task("192.168.1.30", 5678)

客户端

代码如下(示例):

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://192.168.1.30:5678', ping_interval=None) as websocket:
        await auth_system(websocket)

        await send_msg(websocket)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python websockets库提供了一种实现WebSocket服务器的方法。在引用的代码中,\[1\]是一个客户端代码示例,\[2\]是一个服务器代码示例,\[3\]是一个解决"RuntimeError: There is no current event loop in thread 'Thread-4'"错误的代码示例。 客户端代码示例中,通过使用websockets库的connect函数连接到服务器的WebSocket端口,并使用send函数发送消息给服务器。然后使用recv函数接收服务器返回的消息。\[1\] 服务器代码示例中,使用websockets库的serve函数创建一个WebSocket服务器,并指定回调函数main_logic来处理客户端发送的消息。在回调函数中,使用recv函数接收客户端发送的消息,并使用send函数将处理后的消息返回给客户端。\[2\] 如果在运行服务器代码时出现"RuntimeError: There is no current event loop in thread 'Thread-4'"错误,可以使用asyncio库的set_event_loop和new_event_loop函数来创建一个新的事件循环,并将其设置为当前事件循环,以解决该错误。\[3\] #### 引用[.reference_title] - *1* *2* [使用Python websockets搭建互联网服务器](https://blog.csdn.net/weixin_42454034/article/details/122759414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [python websockets服务端](https://blog.csdn.net/weixin_40532625/article/details/94603273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值