分享
  1. 首页
  2. 文章

用gorilla websocket 搞一个聊天室

只是一个id · · 2520 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这个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 等类型就是这里了
}

如果有空闲时间就再搞搞多聊天室的实现, 以及优化一下目前的事件循环逻辑
(削除) 如果还有更多的余力, 就搞一个好看点的客户端? (削除ここまで)

demo地址
我的博客


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:只是一个id

查看原文:用gorilla websocket 搞一个聊天室

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2520 次点击 ∙ 1 赞
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏