引言
实时性较高的地方,我们可能会使用到websocket对信息进行实时推送,涉及到websocket就会有开启连接,接收消息,推送消息,错误处理等机制,那么现在我们就使用go语言来实现一个消息的实时推送与接收
进入正题
1、依赖
除去正常的go的sdk依赖我们需要另一个依赖
"github.com/gorilla/websocket"
2、升级客户端
我们使用的websocket都是从http升级上去的,所以直接贴上代码
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
// 这里设置拦截或者其他东西,返回true则升级,返回false直接拦截,不升级
return true
},
}
3、websocket处理方法
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、完整代码
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
}
}
}