深入浅出golangGolang基础知识Golang

Go语言实现的WebSocket

2018-07-17  本文已影响101人  仕明同学
服务端的代码的实现 服务端的信息

WebSocket 原理

request的信息.png
GET http://localhost:8080/shiming HTTP/1.1
Host: localhost:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: _ga=GA1.1.27955907.1529919744
Sec-WebSocket-Key: PCD+pA79juC6tlBK9zD3Vw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

PCD+pA79juC6tlBK9zD3Vw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
response信息.png
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 8+5CLWTBYLARKoxBxS5uk6s6zZo=

Go语言实现Websocket

go get golang.org/net/websocket
<html>
<head>
    <title>好好学习</title>
</head>
<body>
<script type="text/javascript">
    var sock = null;
    // var wsuri = "wss://127.0.0.1:8080"; //本地的地址 是可以改变的哦
     var wsuri = "ws://localhost:8080/shiming"; //本地的地址 是可以改变的哦


    window.onload = function() {
        //可以看到客户端JS,很容易的就通过WebSocket函数建立了一个与服务器的连接sock,当握手成功后,会触发WebScoket对象的onopen事件,告诉客户端连接已经成功建立。客户端一共绑定了四个事件。
        console.log("开始了 onload");

        sock = new WebSocket(wsuri);
        //建立连接后触发
        sock.onopen = function() {
            console.log(" 建立连接后触发 connected to " + wsuri);
        }
        // 关闭连接时候触发
        sock.onclose = function(e) {
            console.log("关闭连接时候触发 connection closed (" + e.code + ")");
        }
        // 收到消息后触发
        sock.onmessage = function(e) {
            console.log("收到消息后触发 message received: " + e.data);
        }
        //发生错误的时候触发
        sock.onerror=function (e) {
            console.log("发生错误时候触发"+wsuri)
        }
    };
     //如果sock被关闭掉了 这里 也会报错的啊
    function send() {
        var msg = document.getElementById('message').value;
        sock.send(msg);
    };
</script>
<h1>GoWebSocketDemo</h1>
<form>
    <p>
        Message: <input id="message" type="text" value="你好啊  shiming 小哥哥  嘿嘿   ">
    </p>
</form>
<button onclick="send();">给服务器发送消息</button>
</body>
</html>
package main

import (
    "fmt"
    "net/http"
    //草拟吗 自己创建的目录 哈哈哈哈哈    还好我比较聪明  要不然 就完蛋了  麻痹
    "golang.org/x/net/websocket"
    "log"
)

func main() {
    fmt.Println("Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持 go get golang.org/x/net/websocket")
    //打印这个信息就,os.Exit(1)  退出程序
    //log.Fatal("shiming")  todo  草拟吗 啊   看清楚啊   后面的域名的地址 有个老子的名字啊
    http.Handle("/shiming",websocket.Handler(Echo))
     if err:=http.ListenAndServe(":8080",nil);err!=nil{
        log.Fatal(err)
     }


}

func Echo(w *websocket.Conn)  {
    var error error
    for   {
        var reply string
        if  error= websocket.Message.Receive(w,&reply);error!=nil{
            fmt.Println("不能够接受消息 error==",error)
            break
        }
        fmt.Println("能够接受到消息了--- ",reply)
        msg:="我已经收到消息 Received:"+reply
        //  连接的话 只能是   string;类型的啊
        fmt.Println("发给客户端的消息: "+msg)

        if error = websocket.Message.Send(w, msg); error != nil {
            fmt.Println("不能够发送消息 悲催哦")
            break
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读