## 服務端
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