「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序( 二 )


「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

下面的两行代码是一些全局变量 , 在应用程序的其它地方会被用到 。全局变量的实践较差 , 不过这次为了简单起见我们还是使用了它们 。第一个变量是一个 map 映射 , 其键对应是一个指向 WebSocket 的指针 , 其值就是一个布尔值 。我们实际上并不需要这个值 , 但使用的映射数据结构需要有一个映射值 , 这样做更容易添加和删除单项 。
第二个变量是一个用于由客户端发送消息的队列 , 扮演通道的角色 。在后面的代码中 , 我们会定义一个 goroutine 来从这个通道读取新消息 , 然后将它们发送给其它连接到服务器的客户端 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

接下来我们创建一个 upgrader 的实例 。这只是一个对象 , 它具备一些方法 , 这些方法可以获取一个普通 HTTP 链接然后将其升级成一个 WebSocket , 稍后会有相关代码介绍 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

最后我们将定义一个对象来管理消息 , 数据结构比较简单 , 带有一些字符串属性 , 一个 email 地址 , 一个用户名以及实际的消息内容 。我们将利用 email 来展示 Gravatar 服务所提供的唯一身份标识 。
由反引号包含的文本是 Go 在对象和 JSON 之间进行序列化和反序列化时需要的元数据 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

Go 应用程序的主要入口总是 "main()" 函数 。代码非常简洁 。我们首先创建一个静态的文件服务 , 并将之与 "/" 路由绑定 , 这样用户访问网站时就能看到 index.html 和其它资源 。在这个示例中我们有一个保存 JavaScript 代码的 "app.js" 文件和一个保存样式的 "style.css" 文件 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

我们想定义的下一个路由是 "/ws" , 在这里处理启动 WebSocket 的请求 。我们先向处理函数传递一个函数的名称 , "handleConnections" , 稍后再来定义这个函数 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

下一步就是启动一个叫 "handleMessages" 的 Go 程序 。这是一个并行过程 , 独立于应用和其它部分运行 , 从广播频道中取得消息并通过各客户端的 WebSocket 连接传递出去 。并行是 Go 中一项强大的特性 。关于它如何工作的内容超出了这篇文章的范围 , 不过你可以自行查看 Go 的官方教程网站 。如果你熟悉 JavaScript , 可联想一下并行过程 , 作为后台过程运行的 Go 程序 , 或 JavaScript 的异步函数 。
「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序
文章图片

文章图片

【「服务器」教你使用Websockets和Go编程语言构建实时聊天应用程序】最后 , 我们向控制台打印一个辅助信息并启动 Web 服务 。如果有错误发生 , 我们就把它记录下来然后退出应用程序 。


推荐阅读