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
		}
	}
}
相关推荐
TomCode先生1 小时前
c#动态树形表达式详解
开发语言·c#
高-老师2 小时前
基于R语言的物种气候生态位动态量化与分布特征模拟
开发语言·r语言·物种气候
大翻哥哥2 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
weixin_437830943 小时前
使用冰狐智能辅助实现图形列表自动点击:OCR与HID技术详解
开发语言·javascript·ocr
鹿鹿学长3 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
zhousenshan3 小时前
Python爬虫常用框架
开发语言·爬虫·python
是誰萆微了承諾4 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT4 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
耶啵奶膘5 小时前
uni-app头像叠加显示
开发语言·javascript·uni-app
看海天一色听风起雨落5 小时前
Python学习之装饰器
开发语言·python·学习