WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信。
注意:WebSocket协议在建立连接时需要使用HTTP协议【WebSocket协议是基于HTTP协议实现的】 
WebSocket与Http的区别?
1、通信方式不同
WebSocket是双向通信模式;HTTP协议的“请求-响应”模式交互。
WebSocket客户端与服务器之间只有在握手阶段是使用HTTP协议的“请求-响应”模式交互,而一旦连接建立之后的通信则使用双向模式交互,不论是客户端还是服务端都可以随时将数据发送给对方;而HTTP协议则至始至终都采用“请求-响应”模式进行通信。也正因为如此,HTTP协议的通信效率没有WebSocket高。

2、协议格式不同
对于HTTP协议来讲,一个数据包就是一条完整的消息; 而WebSocket客户端与服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消息(message)。即:发送端将消息切割成多个帧(frame),并发送给服务端;服务端接收消息帧,并将关联的帧重新组装成完整的消息。
3、比起HTTP协议,WebSocket具备如下特点:
- 支持双向通信,实时性更强。
- 更好的二进制支持。
- 较少的控制开销:连接创建后,WebSockete客户端、服务端进行数据交换时,协议控制的数据包头部较小。
- 支持扩展。

WebSocket开发
一、js在http连接的基础上发送ws握手请求
js可以基于同一个http创建多个websocket连接: (http与多个websocket共同使用底层的同一个tcp连接)
js代码:ws = new WebSocket("ws://localhost:8080/ws/bullet/2001");

二、http分发握手请求
请求注入路由
router.GET("/ws/:flag/:id", websocketcontroller.UpgradeToWS)
三、使用第三方轮子处理ws握手请求
- ws握手
- 成功后获得可以相互通信的连接!
websocket来自第三方轮子:"github.com/gorilla/websocket"
var (
upgrader = &websocket.Upgrader{
ReadBufferSize: 2048,
WriteBufferSize: 2048,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
)
func UpgradeToWS(res http.ResponseWriter, req *http.Request, params httprouter.Params) {
conn, err := upgrader.Upgrade(res, req, nil)
if err != nil {
log.Println("连接错误")
return
}
/ws握手成功,获得可以相互通信的连接!
switch params.ByName("flag") {
case "bullet":
bulletController.BulletCtr(conn, params)
}
}
四、使用连接进行双向通信
func BulletCtr(conn *websocket.Conn, params httprouter.Params) {
......
go func() {
for true {
data := "heartbeat\n当前直播间ID:" + strconv.Itoa(id) + "\n当前直播间在线人数:" + strconv.Itoa(b.GetOnline())
if err = conn.WriteMessage(1, []byte(data)); err != nil {
return
}
time.Sleep(4 * time.Second)
}
}()
for true {
if err = b.SendMsg(conn); err != nil {
break
}
}
b.DeleteConn(conn)
}
|