Adb6b2937630f698d08b2e38ebb17d2a
go 构建 websocket 长连接(2):路由处理

上节课我们讲解了client发送信息过来如何升级为websocket并注册到我们的服务里,这节课我们讲下如何处理这些信息,源码在文章末尾。

注册方法

main函数内添加两个方法

func main() {
    flag.Parse()
    hub := websocket_gateway.GetGateWay()
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        websocket_gateway.ServeWs(hub, w, r)
    })
    websocket_gateway.GetRuteInstance().HandleFunc(opcodes.APP_LOGIN_OUT, controllers.LoginOut)   //退出
    websocket_gateway.GetRuteInstance().HandleFunc(opcodes.APP_HAND_SHAKE, controllers.HandShake) //握手
    go hub.Run()
    err := http.ListenAndServe(*addr, nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

HandleFunc方法是个闭包函数,实际上是把方法名字和方法函数store到map里面存储,客户端过来的时候要调用对应的方法 处理数据,下面是客户端的逻辑,根据code去找对应的方法。

rute, ok := router.opcode_list.Load(uint16(code))

我们举例handshake方法

func HandShake(client *websocket_gateway.Client, message []byte) {
    protos := proto.ClientProto{}
    protos.Code = opcodes.APP_HEART

    client.Info.Verson = protocol.Version
    client.Info.Platform = protocol.Platform

    data, _ := json.Marshal(protos)
    fmt.Println("data",data)
    fmt.Println("cccc",client.Info)
    client.Replay(data)
}

内参是client和message,为什么是这两个参数,是因为ReadPump方法里的Serve 调用
```

top Created with Sketch.