Python——eventlet.websocket

  使用该模块可以方便地创建 websocket 服务器,要创建一个websocket服务器,只需要将一个句柄函数用装饰器 WebSocketWSGI 装饰即可,然后这个函数就可以当做一个WSGI应用:

from eventlet import wsgi, websocket
import eventlet

@websocket.WebSocketWSGI
def hello_world(ws):
    ws.send("hello world")

wsgi.server(eventlet.listen((‘‘, 8090)), hello_world)

  注:Please see graceful termination warning in server() documentation

  You can find a slightly more elaborate version of this code in the file examples/websocket.py.

  As of version 0.9.13, eventlet.websocket supports SSL websockets; all that’s necessary is to use an SSL wsgi server.

class eventlet.websocket.WebSocketWSGI(handler)

  在一个 WSGI 应用中包裹一个websocket句柄函数

  示例:

@websocket.WebSocketWSGI
def my_handler(ws):
    from_browser = ws.wait()
    ws.send("from server")

  参数是 WebSocket 实例,从函数中返回就会关闭 socket,服务器会在关闭时记录websocket的请求

class eventlet.websocket.WebSocket(sock, environ, version=76)

  一个 websocket 对象,处理套接字的 serialization/deserialization 细节

  与一个 WebSocket 对象交互的主要手段是调用 send() 和 wait(),通过该调用可以与浏览器之间进行消息传递,下面的属性也可用:

  path

  请求的路径值,等同于 WSGI PATH_INFO 变量,但是更方便

  protocol

  Websocket-Protocol 头字段的值

  origin

  ‘Origin’ 头字段的值

  environ

  该请求的完整 WSGI 环境

  close() 

  强制关闭 websocket; generally it is preferable to return from the handler method.

  send(message) 

  向浏览器发送一个消息

  message 应被转化成一个字符串, unicode 对象应被编码为 utf-8。如果套接字已经被客户端关闭,抛出异常 socket.error 和 errno 32 (broken pipe)

  wait() 

  等待和反序列化消息

  返回最久没有被处理的那条消息。如果客户端关闭了连接,返回 None,不同于普通的套接字行为因为空字符串也是有效的websocket消息。

时间: 2024-10-10 10:34:20

Python——eventlet.websocket的相关文章

[Python]通过websocket与js客户端通信

网站大多使用HTTP协议通信,而HTTP是无连接的协议.只有客户端请求时,服务器端才能发出相应的应答,HTTP请求的包也比较大,如果只是很小的数据通信,开销过大.于是,我们可以使用websocket这个协议,用最小的开销实现面向连接的通信. 具体的websocket介绍可见http://zh.wikipedia.org/wiki/WebSocket 这里,介绍如何使用Python与前端js进行通信. websocket使用HTTP协议完成握手之后,不通过HTTP直接进行websocket通信.

python 实现websocket

python中websocket需要我们自己实现握手代码,流程是这样:服务端启动websocket服务,并监听.当客户端连接过来时,(需要我们自己实现)服务端就接收客户端的请求数据,拿到请求头,根据请求头信息封装响应头,并将响应头发给前端,这样就完成了一次握手,接下来服务端和客户端才可以通信. 上代码,我的代码只涉及到服务端发消息给客户端的情况 先说一下代码涉及到的知识 1.单例模式 2.多线程 3.redis 4.websokcet 5.在docker容器中运行 #!/usr/bin pyth

Python——eventlet

eventlet语境下的“绿色线程”普通线程之间的区别: 1. 绿色线程几乎没有开销,不用像保留普通线程一样保留“绿色线程”,每一个网络连接对应至少一个“绿色线程”: 2. 绿色线程需要人为的设置使其互相让渡CPU控制权,而不是抢占.绿色线程既能够共享数据结构,又不需要显式的互斥控制,因为只有当一个绿色线程让出了控制权后其他的绿色线程才能访问彼此共享的数据结构. 下图是eventlet中协程.hub.线程.进程之间的关系: ____________________________________

Python——eventlet.hubs

Hub构成了 Eventlet 的事件循环,它分发 I/O 事件.调度 greenthread.Hub的存在使得协程被提升为 greenthreads. Eventlet 有多种hub的实现,所以在使用之前应该选择最适合自己系统的实现: epolls 要求 Python 2.6 或 python-epoll 包,同时只支持 Linux.这是最快的纯Python hub. poll 所有支持它的平台均可. selects 哪都能用. pyevent 基于libevent的后端,最快!默认是不被支持

Python——eventlet.backdoor

eventlet.backdoor 是正在运行中的进程内的 Pyhon 交互解释器. 该模块便于检测一个长期运行进程的运行状态,提供了一种可以不阻塞应用正常操作的 Pyhon 交互解释器,从而极大地方便了调试.性能调优或仅仅是了解事情是怎么运转的. 在应用中孵化一个协程,这个协程运行一个 backdoor_server ,这个 backdoor_server 中有一个处于监听状态的套接字: eventlet.spawn(backdoor.backdoor_server, eventlet.lis

Python——eventlet.event

该模块提供eventlet的事件支持,事件提供了跨 greenthread 的操作原语. 同一个事件对象既可以发出事件也可以接收(等待)事件,不同的协程共享这一个事件对象,就为不同协程之间基于事件的同步提供了可能. class eventlet.event.Event 该类型抽象了以下事件:任意数量的协程可以等待其他一个协程发出的某一个事件. 事件类似于一个只能容纳一个对象的队列,但是有以下两个方面的区别: 1. 调用 send() 绝不会取消对当前greenthread的调度: 2. send

python模拟websocket握手过程中计算sec-websocket-accept

背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服务器发出请求,然而HTTP请求的header是非常长 的,而实际传输的数据可能很小,这就造成了带宽和服务器资源的浪费. Comet使用了AJAX改进了轮询,可以实现双向通信.但是Comet依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源. 于是,WebSocke

[Python]通过websocket与jsclient通信

站点大多使用HTTP协议通信.而HTTP是无连接的协议.仅仅有client请求时,server端才干发出对应的应答.HTTP请求的包也比較大,假设仅仅是非常小的数据通信.开销过大.于是,我们能够使用websocket这个协议,用最小的开销实现面向连接的通信. 详细的websocket介绍可见http://zh.wikipedia.org/wiki/WebSocket 这里,介绍怎样使用Python与前端js进行通信. websocket使用HTTP协议完毕握手之后,不通过HTTP直接进行webs

python实现websocket服务器,可以在web实时显示远程服务器日志

一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上查看日志,非常麻烦,为了偷懒,能在页面点几下按钮完成工作,所以这几天查找了这方面的资料,实现了这个功能,瞬间觉的看日志什么的,太方便了,以后也可以给开发们查日志,再也不用麻烦运维了,废话少说,先看效果吧. 二.代码 在实现这功能前,看过别人的代码,发现很多都是只能在web上显示本地的日志,不能看远程