Golang websocket 实现消息推送
服务端实现
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"golang.org/x/net/websocket"
)
func add(ws *websocket.Conn) {
msg := make([]byte, 512)
n, err := ws.Read(msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Receive: %s\n", msg[:n])
sendMsg := "订单添加:" + string(msg[:n])
_, err = ws.Write([]byte(sendMsg))
if err != nil {
log.Fatal(err)
}
fmt.Printf("Send: %s\n", sendMsg)
}
func del(ws *websocket.Conn) {
var msg string
err := websocket.Message.Receive(ws, &msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Receive: %s\n", msg)
sendMsg := "订单删除:" + msg
err = websocket.Message.Send(ws, sendMsg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Send: %s\n", sendMsg)
}
func main() {
http.Handle("/add", websocket.Handler(add))
http.Handle("/del", websocket.Handler(del))
fmt.Println("开始监听8888端口...")
err := http.ListenAndServe(":8888", nil)
if err != nil {
log.Fatal(err)
}
}
客户端实现
package main
import (
"encoding/json"
"fmt"
"log"
"golang.org/x/net/websocket"
)
func add(param string) {
ws, err := websocket.Dial("ws://127.0.0.1:8888/add", "", "http://127.0.0.1:8888/")
if err != nil {
log.Fatal(err)
}
defer ws.Close() //关闭连接
sendMsg := []byte(param)
_, err = ws.Write(sendMsg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Send: %s\n", string(sendMsg))
msg := make([]byte, 512)
m, err := ws.Read(msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Receive: %s\n", msg[:m])
}
func del(param string) {
ws, err := websocket.Dial("ws://127.0.0.1:8888/del", "", "http://127.0.0.1:8888/")
if err != nil {
log.Fatal(err)
}
defer ws.Close() //关闭连接
sendMsg := param
err = websocket.Message.Send(ws, sendMsg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Send: %s\n", sendMsg)
var msg string
err = websocket.Message.Receive(ws, &msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Receive: %s\n", msg)
}
func main() {
add("小龙虾")
add("鱼香肉丝")
del("小龙虾")
}
测试
启动服务端代码:
运行客户端代码:
服务端逻辑处理:
这里客户端是用后端代码实现,当需要前端页面与服务端进行交互时,可以将客户端改成页面请求调用,收到消息后显示即可。
公众号:李田路口