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
		}
	}
}
相关推荐
笨拙的老猴子22 分钟前
[特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
java·开发语言
水木流年追梦24 分钟前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式
电子云与长程纠缠1 小时前
UE5制作六边形包裹球体效果
开发语言·python·ue5
砍材农夫1 小时前
物联网 基于netty构建mqtt协议规范(遗嘱与保留消息)
java·开发语言·物联网·netty
froginwe111 小时前
Python3 迭代器与生成器
开发语言
xiaoshuaishuai81 小时前
C# 签名异常与Gas预估失败调试方案
开发语言·网络·tcp/ip·c#
xiaoshuaishuai81 小时前
C# Gemini 辅助网络安全漏洞分析
开发语言·web安全·c#
念恒123061 小时前
Python(循环中断)
开发语言·python
社交怪人1 小时前
【数字对调】信息学奥赛一本通C语言解法(题号2070)
c语言·开发语言
hef2882 小时前
C语言中char指针与数组的区别及应用
c语言·开发语言