当前位置 博文首页 > 莫忘输赢的博客:Go-一个使用websocket的例子<github.com/goril
一、服务端代码
package main
import (
"encoding/json"
"fmt"
"net"
"net/http"
"time"
"github.com/gorilla/websocket"
)
type msgJson struct {
M_str string
}
func main() {
//创建监听器
listener,err := net.Listen("tcp", "127.0.0.1:18802")
//控制连接我的客户端数量
var num = 0
//打印错误
fmt.Println(err)
mux := http.NewServeMux()
var upgrader = websocket.Upgrader{
CheckOrigin:func(r *http.Request) bool {
return true
},
}
mux.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
//升级成功后将获取到WebSocket.Conn 利用这个Conn可进行消息收发
c,err := upgrader.Upgrade(w,r,nil)
if err != nil {
fmt.Println("upgrade error")
return
}
num++
//将msg转化成字节数组
msg := msgJson{M_str: "xxxxx"}
msgbyte,err := json.Marshal(msg)
//var kkk msgJson
//json.Unmarshal(msgbyte,&kkk)
if err == nil {
//发送
c.WriteMessage(websocket.BinaryMessage,msgbyte)
}
})
sv := http.Server{Addr: "127.0.0.1:18802",Handler: mux}
go func() {
err := sv.Serve(listener)
fmt.Println("Http.serve error:",err)
}()
//阻塞主线程
for {
if num > 100 {
time.Sleep(1000)
break
}
}
}
二、客户端代码
提供了两种解决方案,一种是html,通过js与我们服务器进行交互,另一种是通过go编写的客户端与我们服务器交互
将下列代码保存为example.html文件
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>请将此文件拖拽到Chrome中打开,并按F12打开调试窗口,Console中查看结果</p>
<script type="text/javascript">
// js二进制操作可参考 https://my.oschina.net/appnet/blog/1647923
window.onload = function () {
console.log("hello")
let ws = new WebSocket("ws://127.0.0.1:18802");
ws.binaryType = "arraybuffer";
ws.onopen = function(evt) {
console.log("Connection open ...");
};
ws.onmessage = function(evt) {
// let dv = new DataView(evt.data);
let decoder = new TextDecoder('utf8')
let jsonBody = decoder.decode(evt.data)
let jsonMsg = JSON.parse(jsonBody)
console.log( "Received Message: " , jsonMsg);
console.log('Retrieved data from server: ' + evt.data.length+', '+evt.data);
};
ws.onclose = function(evt) {
console.log("Connection closed.");
};
}
</script>
</body>
</html>
将下列代码保存为client.go文件
package main
import (
"encoding/json"
"fmt"
"net/http"
"time"
"github.com/gorilla/websocket"
)
type msgJson struct {
M_str string
}
func main() {
//
//链接上服务端,并接收来自服务端的信息
dialer := websocket.Dialer{}
dialer.Proxy = http.ProxyFromEnvironment
dialer.HandshakeTimeout = 45 * time.Second
conn, _, err := dialer.Dial("ws://127.0.0.1:18802", nil)
if err != nil {
//
fmt.Println("connect error")
}else {
fmt.Println("connect suc")
}
//接收来自服务器的消息并打印
_, msgbyte, err := conn.ReadMessage()
fmt.Println(err)
var msgobj msgJson
json.Unmarshal(msgbyte,&msgobj)
fmt.Println("msgObj:",msgobj)
conn.Close()
}
三、效果展示
html的客户端
go的客户端
?
cs