首页 存档 技术 查看内容

WebSockets开发

2018-3-30 13:00 |来自: 互联网 338 0

摘要: Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 WebSockets WebSocket是用于客户端和服务器之间的双向数据传输的标准协议。WebSockets协议不通过HTTP运行,而是创建在TCP之上单独运行。 为什么 ...


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客户端

  • JavaScript client端的Socket.IO可以实现WebSocket服务器端连接

  • 基于Flash的Web-socket-js 可以实现WebSockets客户端连接

Python 实现

  • Autobahn 使用Twisted 或者asyncio 实现webSockets协议

  • Crossbar.io基于Autobahn构建,如果web应用开发者需要的话,它还包括了处理WebSockets连接的单独的服务器。

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),更多微信文章请扫描关注公众号:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部