- 有的时候我们会用到websocks来处理一些即时的Web事物,比如像聊天室之类,Go语言的websocks运用起来还是很简单的,有一个现成的包gobwas,本文化繁为简,砍掉绝大部分高阶用法,中间也填了几个不算很深的坑,此代码复制粘贴后可运行。
package main
import (
"fmt"
"github.com/gobwas/ws" //Websocks工具
"github.com/gobwas/ws/wsutil"
"net"
"net/http"
)
var conn net.Conn //全局conn
func main() {
var httpSrv *http.Server
httpSrv = &http.Server{Addr: ":8082"}
http.HandleFunc("/", wss)
httpSrv.ListenAndServe()
}
func startWsServer(w http.ResponseWriter, r *http.Request) net.Conn {
conn, _, _, _ = ws.UpgradeHTTP(r, w)
return conn
}
func wss(w http.ResponseWriter, r *http.Request) {
if conn != nil {
fmt.Println("old conn killed:", conn)
conn.Close()
}
//此处不能直接初始化conn,而是需要用一个函数来初始化conn,否则数据交换太快了会卡顿,原因未知
conn := startWsServer(w, r)
fmt.Println("new conn creative:", conn)
for {
msg_receive, _, _ := wsutil.ReadClientData(conn)
str_receive := string(msg_receive)
if str_receive != "" {
fmt.Println("msg_receive: ", str_receive) //接收到客户端的内容
if str_receive == "123" { //如果客户端发来"123",则回传"Hello World!"
sm("Hello World!")
}
}
}
}
func sm(cmds string) {
var msg_send []byte = []byte(cmds)
wsutil.WriteServerMessage(conn, ws.OpText, msg_send)
}
网友评论