首页 > 其他分享 >Go语言Revel框架 的聊天室示例解读

Go语言Revel框架 的聊天室示例解读

时间:2023-07-18 21:04:49浏览次数:106  
标签:聊天室 chat revel 示例 Revel go Go robfig com

安装Revel框架请参看下面这篇文章:《Go语言Revel框架 准备工作》 

运行聊天室例子

运行聊天室例子只需执行下面命令:

$ revel run github.com/robfig/revel/samples/chat

$ revel run github.com/robfig/revel/samples/chat
~
~ revel! http://robfig.github.com/revel
~
2013/03/25 11:54:42 revel.go:240: Loaded module static
2013/03/25 11:54:42 run.go:57: Running chat (github.com/robfig/revel/samples/chat) in dev mode
2013/03/25 11:54:42 harness.go:143: Listening on :9000
2013/03/25 11:54:55 revel.go:240: Loaded module static
2013/03/25 11:54:55 main.go:26: Running revel server
2013/03/25 11:54:55 i18n.go:93: Error reading messages files: lstat /Users/cybercare/go/src/github.com/robfig/revel/samples/chat/messages: no such file or directory
Listening on port 52482...

这时候访问 http://localhost:9000/ 就可以让你选择昵称和连接方式进入聊天的界面。

Go语言Revel框架 的聊天室示例解读_hive

代码解读

目录组织结构

这个演示程序的目录组织结构:

Here are the contents of the app:

chat/app/
 chatroom # Chat room routines 聊天室协程
 chatroom.go 
 controllers 
 app.go # The welcome screen, allowing user to pick a technology 欢迎页面,允许客户选择一个数据
 refresh.go # Handlers for the "Active Refresh" chat demo 定时刷新的聊天室Demo
 longpolling.go # Handlers for the "Long polling" ("Comet") chat demo 长连接 Comet技术的聊天室
 websocket.go # Handlers for the "Websocket" chat demo Websocket 技术的聊天室
 views 
 ... # HTML and Javascript


解读 chatroom.go 

一个聊天室开一个协程来单独处理,chatroom() 函数无限循环运行,处理每次聊天的请求。

func
     go
}
 
chatroom() 函数 在三个 channels 之间 select, 并执行相应的请求操作。
type Event struct {
    Type      string // "join", "leave", or "message" 演示Demo只有这三种类型
string // 发出事件的用户名
    Timestamp int    // Unix timestmap (secs) 发出事件的系统时间
    Text      string // What the user said (if Type == "message")  用户说的内容,只有 Type=message时,才会有这个信息。
}
 
type Subscription struct
    Archive []Event      // All the events from the archive.  归档的所有事件
    New     <-chan Event // New events coming in.  新到来的事件
}

var (
    // Send a channel here to get room events back.  It will send the entire
    // archive initially, and then new messages as they come in.
    // 当有新用户加入时,初始化的一些订阅信息。
    subscribe = make(chan (chan<- Subscription), 10)

    // Send a channel here to unsubscribe.
    // 在信道channel中发送退订。
    unsubscribe = make(chan (<-chan Event), 10)

    // Send events here to publish them.
    // 在这里发送事件
    publish = make(chan Event, 10)
)
 
// This function loops forever, handling the chat room pubsub
func
:= list.New()      // 最近的几条聊天记录
:= list.New()  // 订阅者列表
 
for
select
case ch := <-subscribe:
            // Add subscriber to list and send back subscriber channel + chat log.
            // 当有新用户加入聊天时,添加到用户列表并给该用户发送 channel 和聊天记录。
case event := <-publish:
            // Send event to all subscribers and add to chat log.
            // 发送 Event 给所有订阅者,并且增加到聊天记录中。
        case unsub :=<-unsubscribe:
            // Remove subscriber from subscriber list.
            // 订阅者离开后,从用户列表中删除离开者。
        }
    }
}

当一个新的用户加入时,处理下面事情:

  1. 把最新的聊天记录Copy出来,以便提供给新来的用户。
  2. 把用户订阅channel加入到聊天者channel清单中。
  3. 聊天订阅者获得新信息的 channel 
case ch := <-subscribe:
 
var
for e := archive.Front(); e != nil; e = e.Next() {
append(events, e.Value.(Event))
            }
:= make(chan Event, 10)
            subscribers.PushBack(subscriber)
<-

 

当用户发布新聊天内容时,发布的event一个一个发送给订阅者的channel,然后event被添加到archive,archive里面的数量大于10,前面的会被移出。

 

case event := <-publish:
 
for ch := subscribers.Front(); ch != nil; ch = ch.Next() {
chan Event) <-
            }
if archive.Len() >=
                archive.Remove(archive.Front())
            }
            archive.PushBack(event)

 

当有用户离开聊天室时,订阅者channel在list中被移除。

case unsub := <-unsubscribe:
 
for ch := subscribers.Front(); ch != nil; ch = ch.Next() {
if ch.Value.(chan Event) ==
                    subscribers.Remove(ch)
break
                }
            }
        }

对聊天室框架代码解读可以看下面这个思维导图:

Go语言Revel框架 的聊天室示例解读_github_02

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考资料:

http://robfig.github.com/revel/index.html

http://robfig.github.com/revel/samples/chat.html

http://robfig.github.com/revel/samples/index.html

Revel示例 - 聊天室

 

http://bbs.studygolang.com/thread-291-1-1.html 

标签:聊天室,chat,revel,示例,Revel,go,Go,robfig,com
From: https://blog.51cto.com/u_15588078/6768117

相关文章

  • Go语言Revel框架 聊天室三种通讯方式分析
    三种机制的切换首页相关的网页请求路由如下:#LoginGET  /GET  /demo                 Application.EnterDemo首页显示输入昵称和三种聊天技术选择入口,选择后form提交到Application.EnterDemo页面。跳转到三种具体的聊天技术页面是通......
  • Golang的跨平台编译程序
    Golang支持交叉编译,也就是说你在32位平台的机器上开发,可以编译生成64位平台上的可执行程序。交叉编译依赖下面几个环境变量:$GOARCH  目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)$GOOS     目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、wind......
  • Go语言用WebSocket的简单例子
    Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持,需要独立下载, Gowebsocketpackage下载地址:http://code.google.com/p/go.net/websocket。Goget命令下载:gogetcode.google.com/p/go.net/websocket Go实现的WebSocket的文档:http://......
  • Golang做的验证码(2)
    前面一篇文章介绍了2个用Golang做的验证码 这里再补充几个:1、在GAE上使用的Google的验证码(ReCAPTCHA)封装https://github.com/ThePiachu/GAE-Go-ReCAPTCHA这个的核心代码只在下面这个文件:https://github.com/ThePiachu/GAE-Go-ReCAPTCHA/blob/master/ReCaptcha/ReCaptcha.go 2、一......
  • Golang连接Oracle数据库
    Golang连接Oracle的库有很多,比较常见的如下:不过,oralce只提供了oci8的接口,必须通过它来调用,所以下面方案都逃不过相关设置。1、go-db-oracle地址:https://code.google.com/p/go-db-oracle/官方介绍:OracleDriverusingcgotocallOCIlibrariesfromOracleInstantClient11.......
  • java mongo 插入geometry 多边形 线 点
    importcom.mongodb.client.MongoCollection;importcom.mongodb.client.model.geojson.LineString;importcom.mongodb.client.model.geojson.Point;importcom.mongodb.client.model.geojson.Polygon;importcom.mongodb.client.model.geojson.Position;importcom.tusvn.cc......
  • Go语言读取网上Json格式的天气预报数据例子
    天气预报接口使用的是:http://www.weather.com.cn/data/sk/101010100.html这里的Json数据如下:{"weatherinfo":{"city":"北京","cityid":"101010100","temp":"1......
  • Sublime Text 2下配置Go语言环境
    安装SublimeText2SublimeText2下载地址:http://www.sublimetext.com/2 SublimeText2可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。我下载的是Mac版的,安装只需要简单的把dmg包打开,把应用文件拖动到Application中即可。......
  • Go安装的设置问题:GOROOT,GOPATH
    Mac下使用Google官方的Go语言安装包:https://code.google.com/p/go/downloads/list 安装的Go,会自动把/usr/local/go/bin目录加入PATH中。这样我们直接在控制台就可以执行go语言的一些命令。http://golang.org/cmd/go/#hdr-GOPATH_environment_variable 下面使用export命令看到......
  • 设计模式-外观模式在Java中的使用示例
    场景外观模式外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。示例自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶、......