用go实现一个简单的websocke的简单demo
1、服务端
package main
import (
"fmt"
"github.com/gorilla/websocket"
"log"
"net/http"
"time"
)
var UP = websocket.Upgrader{}
var conns []*websocket.Conn
var msg = make(chan string, 20)
func hanlder(w http.ResponseWriter, r *http.Request) {
conn, err := UP.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
// 保存所有的链接
msg <- "有人上线:" + fmt.Sprintf("%v", conn.RemoteAddr())
go broadcast(conns)
conns = append(conns, conn)
for {
_, p, e := conn.ReadMessage()
if e != nil {
break
}
// 遍历链接,广播发送消息
msg <- fmt.Sprintf("%v:%s", conn.RemoteAddr(), string(p))
go broadcast(conns)
}
conn.WriteControl(websocket.CloseMessage, []byte("关闭链接"), time.Now().Add(time.Second))
defer conn.Close()
log.Println("服务关闭")
}
//广播消息
func broadcast(conns []*websocket.Conn) {
m := <-msg
for i := range conns {
conns[i].WriteMessage(websocket.TextMessage, []byte(m))
}
}
func main() {
// websocket接口
http.HandleFunc("/", hanlder)
// 通过web接口推送消息
http.HandleFunc("/msg", func(writer http.ResponseWriter, request *http.Request) {
// 从body获取消息推送
//body := request.Body
//b, _ := io.ReadAll(body)
//body.Close()
//fmt.Println(string(b))
// 从form表单获取消息推送
b := request.FormValue("msg")
fmt.Println(b)
msg <- b
fmt.Println(conns)
go broadcast(conns)
writer.Write([]byte(fmt.Sprintf("%v", "发送成功")))
})
http.ListenAndServe(":8000", nil)
}
2、客户端
package main
import (
"bufio"
"fmt"
"github.com/gorilla/websocket"
"log"
"os"
)
func main() {
dl := websocket.Dialer{}
conn, _, err := dl.Dial("ws://127.0.0.1:8000", nil)
if err != nil {
log.Println(err)
return
}
go send(conn)
for {
m, p, e := conn.ReadMessage()
if e != nil {
break
}
fmt.Println(m, string(p))
}
defer conn.Close()
}
func send(conn *websocket.Conn) {
for {
reader := bufio.NewReader(os.Stdin)
l, _, _ := reader.ReadLine()
conn.WriteMessage(websocket.TextMessage, l)
}
}
3运行的效果
![](https://img.haomeiwen.com/i4455227/0df905c681feceb1.png)
网友评论