用gorilla websocket 搞一个聊天室

栏目: Html5 · 发布时间: 6年前

内容简介:这个demo实现了:通过命令行来进行聊天具体逻辑都在 websocket.go 这个文件里

这个demo实现了:

  1. 消息广播
  2. 心跳检测

通过命令行来进行聊天

具体逻辑都在 websocket.go 这个文件里

这里的核心就是 aliveList 这个全局变量, 负责把消息分发给各客户端, 事件用channel来传递, 减少阻塞

单个链接会在 aliveList 中注册, ConnList 就是所有活跃的链接

// AliveList 当前在线列表
type AliveList struct {
    ConnList  map[string]*Client
    register  chan *Client
    destroy   chan *Client
    broadcast chan Message
    cancel    chan int
    Len       int
}

// Client socket客户端
type Client struct {
    ID     string
    conn   *websocket.Conn
    cancel chan int
}

服务启动后会执行事件监听循环

// 启动监听
func (al *AliveList) run() {
    log.Println("开始监听注册事件")
    for {
        select {
        case client := <-al.register:
            log.Println("注册事件:", client.ID)
            al.ConnList[client.ID] = client
            al.Len++
            al.SysBroadcast(ConnectedMessage, Message{
                ID:      client.ID,
                Content: "connected",
                SentAt:  time.Now().Unix(),
            })

        case client := <-al.destroy:
            log.Println("销毁事件:", client.ID)
            err := client.conn.Close()
            if err != nil {
                log.Printf("destroy Error: %v \n", err)
            }
            delete(al.ConnList, client.ID)
            al.Len--

        case message := <-al.broadcast:
            log.Printf("广播事件: %s %s %d \n", message.ID, message.Content, message.Type)
            for id := range al.ConnList {
                if id != message.ID {

                    err := al.sendMessage(id, message)
                    if err != nil {
                        log.Println("broadcastError: ", err)
                    }
                }
            }

        case sign := <-al.cancel:
            log.Println("终止事件: ", sign)
            os.Exit(0)
        }
    }
}

因为消息的类型比较多, 单纯字符串无法满足需求, 就选用了比较常用的json格式去传递, 消息目前分:

const (
    // SystemMessage 系统消息
    SystemMessage = iota
    // BroadcastMessage 广播消息(正常的消息)
    BroadcastMessage
    // HeartBeatMessage 心跳消息
    HeartBeatMessage
    // ConnectedMessage 上线通知
    ConnectedMessage
    // DisconnectedMessage 下线通知
    DisconnectedMessage
)



// Message 消息体结构
type Message struct {
    ID      string
    Content string
    SentAt  int64
    Type    int     // <- SystemMessage 等类型就是这里了
}

如果有空闲时间就再搞搞多聊天室的实现, 以及优化一下目前的事件循环逻辑

如果还有更多的余力, 就搞一个好看点的客户端?

以上所述就是小编给大家介绍的《用gorilla websocket 搞一个聊天室》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

HTML Dog

HTML Dog

Patrick Griffiths / New Riders Press / 2006-11-22 / USD 49.99

For readers who want to design Web pages that load quickly, are easy to update, accessible to all, work on all browsers and can be quickly adapted to different media, this comprehensive guide represen......一起来看看 《HTML Dog》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换