Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
WebSockets
WebSocket是用于客户端和服务器之间的双向数据传输的标准协议。WebSockets协议不通过HTTP运行,而是创建在TCP之上单独运行。
为什么要使用WebSockets?
WebSocket连接允许客户端和服务器之间的全双工通信,以便任何一端都可以通过已建立的连接将数据推送到另一端。WebSockets以及SSE、WebRTC相关技术的重要性在于HTTP不用保持长连接就能够使服务器频繁地将数据推送到Web浏览器。 以前大多数Web应用程序通过频繁的异步请求(AJAX)实现长轮询,如下图所示。
服务器推送比长轮询更高效和可扩展,因为浏览器不必不断地通过AJAX请求来请求更新。
在上面的图表显示了服务器推送数据到客户端,因为WebSockets是全双工连接的,因此客户端也可以推送数据到服务器,
如下图所示。
用于服务器和客户端推送更新的WebSockets方法适用于某些类型的Web应用程序,例如聊天室,这是为什么这通常是WebSocket库的示例应用程序。
实现WebSockets
Web浏览器和服务器为了建立和维护连接都必须实现WebSockets协议。因为WebSockets连接是长期的,不像典型的HTTP连接,这对于服务器有重要的影响。
基于多线程或多进程服务器WebSockets不能做到合适的扩展,因为它旨在打开连接,尽可能快地处理请求,然后关闭连接。异步服务器(例如Tornado或者gevent)对于WebSockets的实现是有必要的。
在客户端,没有必要为WebSockets使用JavaScript库。浏览器将通过WebSockets对象公开所有必要的客户端功能。
当然,JavaScript可以通过优雅降级(通常在不支持WebSockets时)并通过特定的浏览器提供WebSocket兼容,可以让开发人员的生活更加轻松,下面给出JavaScript客户端和Python实现的例子。
JavaScript客户端
Python 实现
Nginx WebSocket 代理
Nginx1.3版本正式支持WebSocket代理。但是,您必须配置Upgrade和Connection Headers,以确保请求通过Nginx 传递到你的WSGI服务器。第一次设置可能比较棘手。
以下是我在我的Nginx文件中,配置WebSockets代理使用的部分配置。
注意,如果您遇到上述示例配置的任何问题,你可以查看官方HTTP代理模块的文档。
以下资源也有助于正确设置配置。
Nginx有一个WebSocket代理的官方页面。
WebSockets in Nginx 演示了Nginx WebSockets的配置。
Proxying WebSockets with Nginx 显示了如何使用Socket.io进行代理。
开源的WebSockets Python示例
python-websockets-example包含创建一个简单的web应用程序的代码,使用Flask,Flask-SocketIO和gevent提供WebSockets。
Flask-SocketIO项目有一个聊天的应用程序,它演示了发送服务器生成的事件和用户在文本框输入的内容
一般的WebSockets资源
W3C官方提供的WebSockets API和WebSockets文案是很好的参考资料,但是对于新手来说这些概念可能比较难。我建议看完下面的这些更易于使用的资源列表后再去看参考文案。
Armin Ronacher的WebSockets 101提供了一个关于WebSockets的详细介绍。他还阐述了WebSockets协议的复杂性,包括数据包的实现。
“我可以使用吗?”网站有一个关于哪儿些Web浏览器和特定版本支持WebSockets的参考图表。
Mozilla开发的资源站对于WebSockets开发来说,是查找文档和工具的好地方。
WebSockets From Scratch 提供了一个很好的协议概述,还展示了底层部分如何与WebSockets配合使用,对于只使用Socket.IO等库的开发者来说,这通常是一个黑盒子。
websocketd 是一个websocket服务器,旨在成为“WebSockets的CGI”。值得一看。
Python指定的WebSockets资源
2015年1月在旧金山发表的“Async Python Web Apps with WebSockets&gevent”,使用FLask现场演示了一个示例程序,允许观众在我构建WebSockets应用程序时进行互动。
Real-time提供了特定的python内容,用于了解过去服务器推送更新是如何实现的,以及Python工具如何演进到执行服务器端更新。
Python 3.3 实现WebSockets使用asyncio模块编写(如果使用Python 3.3,则使用Tulip)。
Choose Your Own Adventure Presentations使用WebSockets教程,通过服务器端的gevent和socketio.js将更新的数据从服务器推送到客户端。
向Django 应用程序添加实时显示,展示了如何使用Django和Crossbar.io在应用程序中实现发布/订阅功能。
Async with Bottle 展示了如何使用Bottle web框架中的greenlets来支持WebSockets
如果你要部署到Heroku,有一个特定的WebSockets指南让你的Python应用程序启动并运行。
这个页面的Reddit线程有一些有趣的评论,我正在努力解决上述内容缺少些什么。
通过python 创建WebSockets聊天显示了一个Twisted服务,该服务在服务器端处理WebSockets连接,以及JavaScript处理客户端的代码。
使用WebSockets同步Flask客户端应用程序是一个快速教程,介绍了如何使用Flask,Flask-SocketIO扩展和Socket.Io 在更改时更新客户端链接的值
-
WebSockets和HTTP / 2是否可以共存? 比较和对比两个协议,并显示他们如何具有差异,这可能会导致WebSockets能连接时间更长。
英文原文:http://www.fullstackpython.com/websockets.html 译者:韩晓
本文转载于微信公众号: Python程序员(pythonbuluo),更多微信文章请扫描关注公众号:
|