Go网络编程☞WebSocket

WebSocket?

WebSocket是基于TCP的应用层协议用于在C/S架构的应用中实现双向通信。

注意:WebSocket协议在建立连接时需要使用HTTP协议【WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的
在这里插入图片描述

WebSocket与Http的区别?

1、通信方式不同

WebSocket是双向通信模式;HTTP协议的“请求-响应”模式交互。

WebSocket客户端与服务器之间只有在握手阶段是使用HTTP协议的“请求-响应”模式交互,而一旦连接建立之后的通信则使用双向模式交互,不论是客户端还是服务端都可以随时将数据发送给对方;而HTTP协议则至始至终都采用“请求-响应”模式进行通信。也正因为如此,HTTP协议的通信效率没有WebSocket高。

在这里插入图片描述

2、协议格式不同

对于HTTP协议来讲,一个数据包就是一条完整的消息;
而WebSocket客户端与服务端通信的最小单位是帧(frame),由1个或多个帧组成一条完整的消息(message)。即:发送端将消息切割成多个帧(frame),并发送给服务端;服务端接收消息帧,并将关联的帧重新组装成完整的消息。

3、比起HTTP协议,WebSocket具备如下特点:
  1. 支持双向通信,实时性更强。
  2. 更好的二进制支持。
  3. 较少的控制开销:连接创建后,WebSockete客户端、服务端进行数据交换时,协议控制的数据包头部较小。
  4. 支持扩展。

在这里插入图片描述


WebSocket开发

一、js在http连接的基础上发送ws握手请求

js可以基于同一个http创建多个websocket连接: (http与多个websocket共同使用底层的同一个tcp连接)

js代码:ws = new WebSocket("ws://localhost:8080/ws/bullet/2001");

在这里插入图片描述

二、http分发握手请求

请求注入路由

// 将现有的http升级成一个websocket
	router.GET("/ws/:flag/:id", websocketcontroller.UpgradeToWS)

三、使用第三方轮子处理ws握手请求

  1. ws握手
  2. 成功后获得可以相互通信的连接!

websocket来自第三方轮子:"github.com/gorilla/websocket"

var (
	upgrader = &websocket.Upgrader{
		ReadBufferSize:   2048,
		WriteBufferSize:  2048,
		// 允许跨域
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	}
)

// UpgradeToWS 将HTTP升级为WebSocket协议
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)
	}

}

四、使用连接进行双向通信

// BulletCtr 直播间弹幕控制
func BulletCtr(conn *websocket.Conn, params httprouter.Params) {
	// 解析直播间ID
	......

	// 发送心跳
	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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值