## 服务端
ws4py附带了一些围绕主要的WebSocket类构建服务端的实现。
#### CherryPy
ws4py提供了一个基于CherryPy 3框架层的WebSocket。 它基于CherryPy插件和工具机制。
WebSocket工具根据服务器收到的每个请求在请求级进行操作。
它的目标是执行WebSocket的握手,如果成功,创建WebSocket实例(以及您将要实现的子类)并将其推送到插件。
WebSocket插件在CherryPy系统级别工作,并且在整个过程中都有一个实例。
其目标是跟踪由工具创建的Websocket实例,并在关闭连接时释放资源。
以下是回应服务器的简单示例:
```
import cherrypy
from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import EchoWebSocket
cherrypy.config.update({'server.socket_port': 9000})
WebSocketPlugin(cherrypy.engine).subscribe()
cherrypy.tools.websocket = WebSocketTool()
class Root(object):
@cherrypy.expose
def index(self):
return 'some HTML with a websocket javascript connection'
@cherrypy.expose
def ws(self):
# you can access the class instance through
handler = cherrypy.request.ws_handler
cherrypy.quickstart(Root(), '/', config={'/ws': {'tools.websocket.on': True,
'tools.websocket.handler_cls': EchoWebSocket}})
```
工具机制的优秀之处在于您可以在每个路径的基础上指定一个不同的类。
#### gevent
gevent是一个协同程序,实现了并发的应用程序。
ws4py在WSGI协议之上为此库提供服务器实现。
使用它的简单实例:
```
from gevent import monkey; monkey.patch_all()
from ws4py.websocket import EchoWebSocket
from ws4py.server.geventserver import WSGIServer
from ws4py.server.wsgiutils import WebSocketWSGIApplication
server = WSGIServer(('localhost', 9000), WebSocketWSGIApplication(handler_cls=EchoWebSocket))
server.serve_forever()
```
首先我们修补所有的标准模块,使stdlib作为gevent运行方式。
然后,我们只需创建一个WSGI服务器,并指定每次连接成功时将内部实例化的类。
#### wsgiref
wsgiref是一个内置的WSGI软件包,可以提供各种类和帮助程序来开发WSGI。
大多数情况下,它提供了可用于测试或简单演示的基本WSGI服务器。
ws4py还提供了对wsgiref的websocket的支持以及测试目的。
这不意味着在生产中使用,因为它只能通过单线程启动一次一个网络套接字连接。
但是,一旦接受,ws4py接管,默认情况下是多线程的。
```
from wsgiref.simple_server import make_server
from ws4py.websocket import EchoWebSocket
from ws4py.server.wsgirefserver import WSGIServer, WebSocketWSGIRequestHandler
from ws4py.server.wsgiutils import WebSocketWSGIApplication
server = make_server('', 9000, server_class=WSGIServer,
handler_class=WebSocketWSGIRequestHandler,
app=WebSocketWSGIApplication(handler_cls=EchoWebSocket))
server.initialize_websockets_manager()
server.serve_forever()
```
#### asyncio
asyncio是并行应用程序的新异步框架PEP 3156的实现。
```
from ws4py.async_websocket import EchoWebSocket
loop = asyncio.get_event_loop()
def start_server():
proto_factory = lambda: WebSocketProtocol(EchoWebSocket)
return loop.create_server(proto_factory, '', 9007)
s = loop.run_until_complete(start_server())
print('serving on', s.sockets[0].getsockname())
loop.run_forever()
```
用于握手的提供的HTTP服务器显然没有准备就绪。
但是,一旦执行了握手,代码的其余部分与其他服务器实现方式运行相同的堆栈。
应该很容易用任何异步感知的HTTP框架来替换HTTP接口。
翻译者:兰玉磊
博客:http://www.lanyulei.com