Go使用websocket

文章目录

引言

实时性较高的地方,我们可能会使用到websocket对信息进行实时推送,涉及到websocket就会有开启连接,接收消息,推送消息,错误处理等机制,那么现在我们就使用go语言来实现一个消息的实时推送与接收

进入正题

1、依赖

除去正常的go的sdk依赖我们需要另一个依赖

go 复制代码
"github.com/gorilla/websocket"

2、升级客户端

我们使用的websocket都是从http升级上去的,所以直接贴上代码

go 复制代码
var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		// 这里设置拦截或者其他东西,返回true则升级,返回false直接拦截,不升级
		return true
	},
}

3、websocket处理方法

go 复制代码
func wsHandle(w http.ResponseWriter, r *http.Request) {
	// 升级为ws
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()
	fmt.Print("连接建立成功")
	for {
		// 读取客户端消息
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			fmt.Println(err)
			return
		}
		// 处理消息

		// 回复或者发送
		err = conn.WriteMessage(messageType, p)
		if err != nil {
			fmt.Println(err)
			return
		}
	}
}

4、完整代码

go 复制代码
package main

import (
	"fmt"
	"github.com/gorilla/websocket"
	"net/http"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		// 允许所有来源的WebSocket连接
		return true
	},
}

func main() {
	http.HandleFunc("/ws", wsHandle)
	err := http.ListenAndServe(":9009", nil)
	if err != nil {
		fmt.Println(err)
	}
}

func wsHandle(w http.ResponseWriter, r *http.Request) {
	// 升级为ws
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()
	fmt.Print("连接建立成功")
	for {
		// 读取客户端消息
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			fmt.Println(err)
			return
		}

		// 处理消息
		fmt.Printf(string(p))

		// 发送消息给客户端
		err = conn.WriteMessage(messageType, p)
		if err != nil {
			fmt.Println(err)
			return
		}
	}
}
相关推荐
qq_4221525715 分钟前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
charliedev20 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他
ji1985944334 分钟前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile199538 分钟前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
love_muming41 分钟前
链表每日一练
java·开发语言·数据结构·链表·idea·每日一练
weixin_4462608542 分钟前
LLM智能体在社交模拟中的决策行为分析:有限状态与LLM-based策略对比研究
开发语言·php
牛肉在哪里1 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
techdashen1 小时前
Cargo 1.94 开发周期全解析
开发语言·后端·rust
charlie1145141911 小时前
现代C++特性指南——constexpr 构造函数与字面类型
开发语言·c++
北城以北88881 小时前
虚拟机安装JDK,Tomcat,部署项目
java·开发语言·tomcat