当前位置 博文首页 > 莫忘输赢的博客:Go-一个使用websocket的例子<github.com/goril

    莫忘输赢的博客:Go-一个使用websocket的例子<github.com/goril

    作者:[db:作者] 时间:2021-07-08 15:43

    一、服务端代码

    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
    下一篇:没有了