1.背景 前端
WebSocket和http协议同样是应用层的协议,都是基于tcp的。在WebSocket出现以前客户端向服务器发出请求是经过http协议实现的,而http协议有个特色是通行请求只能由客户端发起,而后服务端响应查询结果,HTTP 协议无法让服务器主动向客户端推送信息。这样若是服务器有连续的状态变化,好比新消息,客户端要获知就很是麻烦,只能经过轮询,长轮询的方式,可是这样的效率很低,消耗了没必要要的服务器资源(由于必须不停发送http链接,或者http链接保持始终打开。在 HTTP1.1 协议中的 keep-alive connection 是指在一次 TCP 链接中完成多个 HTTP 请求,可是对每一个请求仍然要单独发 header,因此这些方式服务器和客户端还要大量交换 httpheader,信息交换效率很低)。node
2.WebSocket简介c++
WebSocket 协议就是可使服务器能够主动向客户端推送信息,客户端也能够主动向服务器发送信息,全双工的方式通讯,属于服务器推送技术的一种。git
3.WebSocket原理github
WebSocket是基于C/S架构,WebSocket是由Http协议握手而来。当客户端与服务端通讯,客户端首先向服务端发起http请求,而这个请求的特殊性在于客户端在http头部(header)里带了一个upgrade字段,告诉服务端它想要生成WebSocket协议,服务端收到以后给客户端一个握手的确认,回答客户端容许它对WebSocket协议的转换,一旦完成这个协商后,客户端和服务端的底层tcp链接是没有中断的,接下来客户端能够向服务端发送基于WebSocket协议的消息,这样就完成了HTTP协议向WebSocket协议的升级,而两端则继续复用HTTP底层socket的连接完成后续的通讯。WebSocket传输单元是message,因为当传递很大的数据包时候,message会被切分红多个frame帧来传输,咱们编程的时候无需关注底层的frame,只须要操做message。golang
4.WebSocket特色web
(1)创建在 TCP 协议之上,服务器端的实现比较容易。编程
(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,而且握手阶段采用 HTTP 协议,所以握手时不容易屏蔽,能经过各类 HTTP 代理服务器。后端
(3)数据格式比较轻量,性能开销小,通讯高效。浏览器
(4)能够发送文本,也能够发送二进制数据。
(5)没有同源限制,客户端能够与任意服务器通讯。
(6)协议标识符是ws(若是加密,则为wss),服务器网址就是 URL。
以下:
ws://example.com:80/path
(7)Websocket为一次HTTP握手后,后续通信为tcp协议的通信方式。
5.WebSocket用途
1)心跳包。
2)网页即时通讯
6.WebSocket后端技术选型
1.nodejs:WebSocket自己主要是应用于浏览器,属于浏览器里面的一种编程,对于前端开发nodejs比较熟悉,可使用nodejs作长连接。不过nodejs仍是js,js自己特性是单线程模型,虽然能够多进程,可是推送性能有限。
2.c/c++:使用c/c++实现WebSocket,成本比较高,可能须要手动实现对WebSocket协议对封装。
3.golang:编译型语言,速度快,多线程,实现并发容易,基于协程模型并发。因此开发起来比较简单,可让咱们更加专一于业务。其次有内置标准的WebSocket标准库,无需造轮子。
7.使用go语言完成WebSocket开发
使用go语言的 gorilla/websocket 第三方开发包来开发WebSocket 服务。
下载包:go get github.com/gorilla/websocket
利用这个开发包开发WebSocket 服务很简单,下面有个demo
package main import ( "net/http" ) func wsHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("websocket connected success!")) } func main() { http.HandleFunc("/ws",wsHandler) http.ListenAndServe("0.0.0.0:7777",nil) }
而后运行,打开浏览器,运行成功