go语言聊天室实现(七)websocket收消息设置

Python011

go语言聊天室实现(七)websocket收消息设置,第1张

上一节中,我们为每个连接都创建了一个goroutine来读取其中的消息,现在我们将这个读取消息的方法实现一下。

我们在application目录下新建controllers目录,并在其中创建一个MessageController.go文件。

首先我们新建一个MessageController的结构体,内容如下

这个结构体包括两个内容,一个是我们将连接放在数组之后,返回的索引,另一个是连接本身.

这个是具体的方法。

我们首先设置了一下读消息的大小、超时时间以及超时后需要的操作。

超时时间如果设置为0,那么就是永不超时。之前在这里直接写0,被告知需要传一个time.Time类型的数据。最终谷歌后才得到了这个值time.Time{}为"0001-01-01 00:00:00 +0000 UTC"。

我们将用户手法消息的内容定义为一个结构体,然后将用户的订阅信息的json通过json.unmarshal转换成这个结构体。

之后的switch操作与我们在Swoole中的操作基本雷同,在查询到login之后,调用service中 的login方法来进行注册。

下一节中我们再介绍具体的注册逻辑。

我们可以看到 gorilla/websocket中的examples中有一个聊天室的demo。

我们进入该项目可以看到里面有这样的一些内容

按照官方的运行方式来运行这个项目

在浏览器中打开8080端口,可以看到该项目可以被成功运行了。

就是这样一个简单的demo。

然后我们去看一下它的具体实现。

在这个项目中首先定义了一个hub的结构体:

这个结构体中,clients代表所有已经注册的用户,broadcast管道会存储客户端发送来的信息。 register是一个*Client类型的管道,用于存储新注册的用户,unregister管道反之。

我们打开main.go,main函数的源码为:

在这里首先会新开一个goroutine,去跑hub的run方法,run方法中一个死循环,不停地去轮询hub中的内容

如果取到了新用户,就加入到clients中,如果取到了信息,就循环所有的client,将信息写到client.send中。

我们看到在请求路径为根的时候,它会请求一个函数,而这个函数就是将home.html发送到客户端。

而在请求路径为“/ws”的时候,他会执行一个serveWS的函数。

每当一个新的用户进来之后,首先将连接升级为长连接,然后将当前的client写到register中,由hub.run函数去做处理。然后开启两个goroutine,一个去读client中发送来的数据,一个将数据写入到所有的client中,去发送给用户。

这就是整个聊天室的实现原理。

LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由QT编写。

LiteIDE主要特点: 支持主流操作系统

Windows

Linux

MacOS X Go编译环境管理和切换

管理和切换多个Go编译环境

支持Go语言交叉编译 与Go标准一致的项目管理方式

基于GOPATH的包浏览器

基于GOPATH的编译系统

基于GOPATH的Api文档检索 Go语言的编辑支持

类浏览器和大纲显示

Gocode(代码自动完成工具)的完美支持

Go语言文档查看和Api快速检索

代码表达式信息显示F1

源代码定义跳转支持F2

Gdb断点和调试支持

gofmt自动格式化支持 其他特征

支持多国语言界面显示

完全插件体系结构

支持编辑器配色方案

基于Kate的语法显示支持

基于全文的单词自动完成

支持键盘快捷键绑定方案

Markdown文档编辑支持

实时预览和同步显示

自定义CSS显示

可导出HTML和PDF文档

批量转换/合并为HTML/PDF文档 Sublime Text 2(以下简称Sublime)+ GoSublime + gocode + MarGo的组合。

其优点有: 自动化提示代码。 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。 支持项目管理 支持语法高亮熟悉Java的读者应该对于idea不陌生,idea是通过一个插件来支持go语言的高亮语法,代码提示和重构实现。