python如何创建websocket服务

WebSocket是什么样的协议,具体有什么优点

首先,相对于Http这种非持久的协议来说,WebSocket是一种持久化的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
(1)Http的生命周期通过Request来界定,也就是Request一个Response,那么在Http1.0协议中,这次Http请求就结束了。
在Http1.1中进行了改进,是的有一个Keep-alive,也就是说,在一个Http连接中,可以发送多个Request,接收多个Response。
但是必须记住,在Http中一个Request只能对应有一个Response,而且这个Response是被动的,不能主动发起。
(2)WebSocket是基于Http协议的,或者说借用了Http协议来完成一部分握手,在握手阶段与Http是相同的。

服务端

>>> import websockets
>>> import asyncio
>>> class WSserver():
		async def handle(self,websocket,path):
			recv_msg = await websocket.recv()
			print("i received %s" %recv_msg)
			await websocket.send('server send ok')
		def run(self):
			ser = websockets.serve(self.handle,"0.0.0.0","8240")
			asyncio.get_event_loop().run_until_complete(ser)
			asyncio.get_event_loop().run_forever()

		
>>> ws = WSserver()
>>> ws.run()
i received aaa
i received bbb
i received ccc
i received ddd
i received eee

客户端

>>> import websockets
>>> import asyncio
>>> async def hello():
	while True:
		async with websockets.connect('ws://localhost:8240')as websocket:
			name = input("what's your name?")
			await websocket.send(name)
			print(f"send server:{name}")
			greeting = await websocket.recv()
			print(f"receive from server:{greeting}")

			
>>> asyncio.get_event_loop().run_until_complete(hello())
what's your name?aaa
send server:aaa
receive from server:server send ok
what's your name?bbb
send server:bbb
receive from server:server send ok
what's your name?ccc
send server:ccc
receive from server:server send ok
what's your name?ddd
send server:ddd
receive from server:server send ok
what's your name?eee
send server:eee
receive from server:server send ok

asyncio 是干什么的?

  • 异步网络操作
  • 并发
  • 协程

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。
asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。

关于asyncio的一些关键字的说明:

  • event_loop 事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数

  • coroutine
    协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。

  • task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态

  • future: 代表将来执行或没有执行的任务的结果。它和task上没有本质上的区别

  • async/await 关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。

使用async可以定义协程对象,使用await可以针对耗时的操作进行挂起,就像生成器里的yield一样,函数让出控制权。协程遇到await,事件循环将会挂起该协程,执行别的协程,直到其他的协程也挂起或者执行完毕,再进行下一个协程的执行,耗时的操作一般是一些IO操作,例如网络请求,文件读取等。我们使用asyncio.sleep函数来模拟IO操作。协程的目的也是让这些IO操作异步化。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值