Erlang cowboy websocket 服务器

Erlang cowboy websocket 服务器

原文见于:

http://marcelog.github.io/articles/erlang_websocket_server_cowboy_tutorial.html

本文不是原文的简单翻译,是参考原文,根据我的理解和实践写出来的。本文的源码见于:

https://github.com/marcelog/erws

1 引言

Erlang可以用来实现一个websocket服务器。cowboy这样框架可以完成这个任务,是我们不必关注websocket协议的细节。在吃正餐之前,我们先来点围碟:

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request d的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求(request),然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

而最比较新的技术去做轮询的效果是长轮询(long polling),这是很古老的技术。长轮询的优势在于,它完全颠覆了典型的客户端发送请求的做法。长轮询的核心在于客户端和服务器间的相互联系,打破了客户端尽快发送请求的传统惯例。客户端期望服务器能够长时间留住请求,保持潜在的TCP连接的开放性。只要服务器拥有希望同客户端共享的信息,它就会将数据传送给客户端并终止连接。这种做法的效率相对较高,免除了所有HTTP请求的麻烦。客户端收到更新数据后马上向服务器发送下个请求,依然期望服务器留住该请求,直到有需要传回的数据为止。

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。长连接、长轮询一般应用与WebIM、ChatRoom和一些需要及时交互的网站应用中。其真实案例有:WebQQ、Hi网页版、Facebook IM等。

而在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

Header,互相沟通的Header是很小的-大概只有 2 Bytes
Server Push,服务器可以主动传送数据给客户端。
因此WebSocket是一种更新更优秀的技术。

2 为什么用cowboy

cowboy是终极悍将。到目前为止(2012-05),可用来写websocket服务的erlang工具有:

Socket.io-Erlang

这是最有吸引力的方法,因为可以用在客户端。Socket.io非常受欢迎,特别在NodeJS里,因为其中一个作者(Frederic Trottier-Hebert)也是LearnYouSomeErlang的作者。可是自从socket.io 0.6.x之后,作者就不再添加新功能。所以对这个产品非常不利。

MochiWeb

非常流行的HTTP框架,但是本身不支持websocket。

Yaws

这个是全功能的 HTTP server,足够健壮性、可扩展性 。适用于静态和动态页面,也支持websockets。但是对我的需求来说,有点杀鸡用牛刀。当然,如果没有其他方案好用,我肯定会选择这个。(译者注:Yaws也是我下一个要学习使用的产品)

Misultin

原作者表示不再更新,已经转向mochiweb和cowboy。

Cowboy

非常有意思的东西。HTTP是这个产品框架的一部分。这个东西更像一个连接池,我们可以设置处理TCP或SSL连接。最大的缺点是缺乏文档,出了问题有时候需要看源代码。

3 开始编程

原文使用了rebar来构建项目。Rebar是一款Erlang的构建工具,使用它可以方便的编译、测试erlang程序、内联驱动和打包Erlang发行版本。

【译者:我继续使用上一篇文章的make工具(Erlang cowboy入门参考),因此,本文与原文略有出入】

这次,我们创建一个erws(Erlang WebSocket),主要的模块就是erws_handler.erl,所有必要的文件都会在下面展示。

当程序运行,cowboy会监听10100端口,分发HTTP请求到erws_handler。

erws_handler实现了2个处理器:cowboy_http_handler和cowboy_websocket_handler。第一个处理器接受普通的HTTP GET请求,并启动websocket完成握手,这个过程通过发送必要的头信息使HTTP连接升级(upgrade),如协议所述。对我们来讲,这个过程非常简单,我们只需要对erws_handler:init/1(参考代码)返回一个元组。所有脏活都是由cowboy的模块cowboy_http_websocket来完成。

一旦这个过程完成,通过调用cowboy_http_websocket_handler暴露出来的api,我们就可以把收到的请求当作消息处理,和普通的gen_server非常类似。

时间: 2024-08-01 02:47:10

Erlang cowboy websocket 服务器的相关文章

Erlang cowboy 入门参考之现代Web的发展历史

Erlang cowboy 入门参考之现代Web发展史 原文: http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/ 让我回顾一下web技术的发展历史,并可预见一下未来的发展.除了HTTP/2.0这个还未正式纳入规范的技术,Cowboy与所有这些技术都是兼容的. 早期的Web 起初的HTTP就是用来对GET请求返回HTML页面的.最初的版本是HTTP/0.9.HTTP/1.0定义了GET,HEAD和POST方法,能通过POST请求发送数

为什么我要选择erlang+go进行服务器架构

服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 估计很多同学看到这里都会觉得迷惑,go的大名已经如雷贯耳了,但是erlang?这个东东是神马?难道是编程语言?怎么从来没听说过. 这里请允许我先介绍一下使用Erlang开发的比较有名的应用: 一:whatsapp 只凭32个技术人员,如何应付4.5亿的用户?对于刚刚被Facebook用190亿美元收购的WhatsApp来说,答案是Erlang--一种诞生于上世纪80年代的编程语言,终于在此时走到了聚光灯下.

Erlang cowboy 入门参考

Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/getting_started/ 我没有按原文逐句翻译.仅仅是我自己的理解,力求简单明了.本文程序在RHEL6.4上写成并运行,参考下面的文章,安装Erlang: erlang在redhat上的安装 1 引言 Erlang不仅仅是一门语言,更是一个操作平台.Erlang开发者很少写单独的模块,而是写库和程序,然

Erlang cowboy http request生命周期

Erlang cowboy http request生命周期 翻译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/http_req_life/ request的生命周期 本章解释服务器response之前的http request的步骤,以及cowboy实现的细节. Request/response 正如你了解到的,HTTP客户端连接到服务器,发送资源请求(request),服务器发送响应(response),其中包含可以获取到的资源. 在服务器发

根据Unix哲学来编写你的HTML5 Websocket服务器来实现全双工通信

websocketd代表WebSocket的守护进程 websocketd处理的是浏览器和服务器之间的WebSocket连接,它会启动你所指定的服务器端应用来对WebSockets进行处理,然后在浏览器和服务器应用之间进行消息的传递. 在20年前的话,有一项叫做CGI的技术做的工作类似,但现在这项技术将会被websocket所取代. 语言无关 只要你的服务器应用是可以从命令行进行运行的,你就可以为你的服务器应用编写WebSocket终端服务. 无需额外的库的支持 通过WebSocketd进行信息

Erlang cowboy 处理不规范的client

Erlang cowboy 处理不规范的client Cowboy 1.0 參考 本章: Dealing with broken clients 存在很多HTTP协议的实现版本号. 很多广泛使用的client,如浏览器.十分符合规范.可是也有一些特殊的client很糟糕,不遵守规范. Cowboy尽可能地遵守规范,可是仍然无法处理所有可能的情形.Cowboy关注真是 web下的自然例子. 假设client不遵守HTTP规范可能会无法理解Cowboy的响应.有一些变通的方法,本章就说明这个问题.

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

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

在IIS上搭建WebSocket服务器(三)

编写客户端代码 1.新建一个*.html文件. ws = new WebSocket('ws://192.168.85.128:8086/Handler1.ashx?user=' + $("#user").val());这个地方的IP和端口号对应着我们搭建在IIS上的WebSocket服务器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <

用C语言实现websocket服务器

Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成,我去研究如何用c语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能,用户通过网页访问到嵌入式设备的摄像头以及音频,在学习的过程中先实现echo server是最基本的. 主要参考资源 编写 WebSocket 服务器--MDN Linux下用C编写WebSocet服务以响应HTML5的WebSocket请求 具体实现 整个websocket从握手到数据传输帧头