设为首页 加入收藏

TOP

GIN+GORILLA=A GOLANG WEBSOCKET SERVER(二)
2017-09-30 13:54:56 】 浏览:1336
Tags:GIN GORILLA GOLANG WEBSOCKET SERVER
ool { return true } conn, err := wsh.wsupgrader.Upgrade(w, r, nil) if err != nil { logger.Error("Failed to set websocket upgrade: " + err.Error()) return } defer conn.Close() if ctx, err := wsh.onOpen(conn, r); err != nil { logger.Error("Open connection failed " + err.Error() + r.URL.RawQuery) return } else { conn.SetPingHandler(func(message string) error { conn.WriteControl(websocket.PongMessage, []byte(message), time.Now().Add(time.Second)) return nil }) for { t, msg, err := conn.ReadMessage() if err != nil { logger.Error("READ ERR FROM " + ctx.String() + " ERR " + err.Error()) wsh.onClose(conn, ctx) return } switch t { case websocket.TextMessage, websocket.BinaryMessage: wsh.onMessage(conn, ctx, msg, t) case websocket.CloseMessage: wsh.onClose(conn, ctx) return case websocket.PingMessage: case websocket.PongMessage: } } } } func (wsh *WebSocketHandler) closeConnWithCtx(ctx *ConnContext) { keyString := ctx.AsHashKey() ctxHashMap.Remove(keyString) return } func (wsh *WebSocketHandler) processIncomingTextMsg(conn *websocket.Conn, ctx *ConnContext, msg []byte) { logger.Debug("CLIENT SAID " + string(msg)) sendMessageToAll(msg) } func (wsh *WebSocketHandler) sendMessageToAll(msg []byte]) { var gzMsg bytes.Buffer gzWriter := gzip.NewWriter(&gzMsg) gzWriter.Write(msg) gzWriter.Flush() gzWriter.Close() for key, conn := range ctxHashMap.Items() { if ctx, err := HashKeyAsCtx(key.(string)); err != nil { wsh.onError(err.Error()) } else { if ctx.supportGzip == "1" { err = conn.(*websocket.Conn).WriteMessage(websocket.BinaryMessage, gzMsg.Bytes()) logger.Debug("send binary msg to " + ctx.String()) } else { err = conn.(*websocket.Conn).WriteMessage(websocket.TextMessage, []byte(msg)) logger.Debug("send text msg to " + ctx.String()) } if err != nil { wsh.onClose(conn.(*websocket.Conn), ctx) conn.(*websocket.Conn).Close() wsh.onError("WRITE ERR TO " + key.(string) + " ERR:" + err.Error()) } } } }

 

因为删了一些线上代码的敏感信息 所以未必编译的过,不过差不多一个意思,主要看气质

里面的一个莫名其妙的叫做ctx的东西出现了很多次其实是connectionContext的缩写,一般链接形如ws://ip:port/?param=value&param1=value1之类的形式,当然会加密,所以在onopen的时候会对url做一次基础校验,并且回记录url的一些关键参数标记,以用来确认消息到底要发送给谁

一个简单connContext实现如下

// connContext.go
package main

import (
    "errors"
    "strings"
    "util"
)

type ConnContext struct {
    specialKey    string
    supportGzip string 
}
func HashKeyAsCtx(hashKey string) (*ConnContext,error){
    values := strings.Split(hashKey,":")
    if(len(values)!=2){
        return nil,errors.New("艾玛 key不对: "+hashKey)
    }else{
        return &ConnContext{values[0],values[1]},nil
    }    
}
func (ctx *ConnContext) AsHashKey() string{
    return strings.Join([]string{ctx.specialKey, ctx.supportGzip},":")
}
func (ctx * ConnContext) String () string{
    return util.NewStringBuilder("specialkey: ",ctx.specialkey, " gzip ",ctx.supportGzip).String()
}

以上 一个简易的websocket server 就这样完成了 可喜可贺

有事儿寻这儿

http://weibo.com/SandCu

 

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇golang-MD5 下一篇godef 插件安装

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目