golang websocket 入门

13 篇文章 0 订阅
9 篇文章 0 订阅

我们先写一个最简单的go http服务

package main

import (
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter,r *http.Request) {
        w.Write([]byte("hello world"))
    })
    http.ListenAndServe(":9000",nil)
}

上面的太简单,就是一个http的服务,启动打开浏览器就可以输出hello world了,这是http,每次一个请求一个返回,虽然http的1.1版本已经支持keep-alive了,但如果想从服务发送到客户端,还是不行的,那么就诞生了websocket了。
现在改进一下代码:

package main

import (
    "net/http"
    "github.com/gorilla/websocket"
    "fmt"
)
var upgrade = websocket.Upgrader{}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter,r *http.Request) {
        w.Write([]byte("hello world"))
    })

    http.HandleFunc("/v1/ws", func(w http.ResponseWriter,r *http.Request) {
        conn, _ := upgrade.Upgrade(w,r,nil)
        go func(conn *websocket.Conn) {
            for{
                //mtype :TextMessage=1/BinaryMessage=-2/CloseMessage=8/PingMessage=9/PongMessage=10
                mtype, msg, _:=conn.ReadMessage()
                switch mtype {
                case 1:
                    conn.WriteMessage(mtype,msg)
                case 8:
                    fmt.Println("close")
                }
            }
        }(conn)

    })
    http.ListenAndServe(":9000",nil)
}

这个里面如果请求的是v1/ws的话就进入websocket的,就是把用户的输入当做输出,返回到客户端。下面通过浏览器console测试一下

var ws = new WebSocket("ws://127.0.0.1:9000/v1/ws")
ws.addEventListener("message",function(e){console.log(e);});
ws.send("123")

运行一下就可以看到效果。当然,如果你不想返回,只是在后端输出一下

mtype, msg, _:=conn.ReadMessage()
fmt.Println(mtype,":", string(msg))

那么前端就收不到任何返回。

进一步,那么如何后端推送呢,

http.HandleFunc("/v1/ws", func(w http.ResponseWriter,r *http.Request) {
        conn, _ := upgrade.Upgrade(w,r,nil)
        go func(conn *websocket.Conn) {
            ch :=time.Tick(5*time.Second)
            for range ch{
                fmt.Println("call")
                conn.WriteMessage(1,[]byte("abc"))

            }
        }(conn)

    })

这样只要前端绑定了这个message就可以定时收到后端的推送了。但是如果前端关闭ws.close()将不会收到推送了。
在结束这篇blog之前还要补充一点就是服务关闭,如果前端关闭,后端任然继续读取数据将会报错panic: repeated read on failed websocket connection。因为无法读取到客户端的数据了。所以还要在第一个例子的地方加上一个异常处理

    mtype, msg, err:=conn.ReadMessage()
    if err != nil{
        conn.Close()
        return
    }

第一篇入门就和大家分享到这来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳清风09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值