IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Go网络编程?WebSocket -> 正文阅读

[网络协议]Go网络编程?WebSocket

WebSocket?

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具备如下特点:

  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)
}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:44:27  更:2021-09-14 13:46:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:46:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码