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

现代网页应用程序正日趋丰富而复杂 。像这样有趣又有活力的体验很受用户欢迎 。用户无需向服务器发起调用 , 或刷新浏览器 , 就可以让页面实时更新 。早期的开发者依赖 AJAX 来创建具备近乎实时体验的应用程序 。而现在 , 他们运用 WebSockets 就能创建完全实时的应用程序了 。
本教程中我们将使用 Go 编程语言以及 WebSockets 来创建一个实时的聊天应用程序 。前端将会使用 HTML5 和 VueJS 来编写 。该内容需要你对 Go 语言, JavaScript 以及 HTML5 有一个基础的了解 , 最好有一点点使用 VueJS 的经验 。WebSocket 是什么?
通常 Web 应用使用一个或多个请求对 HTTP 服务器提供对外服务 。客户端软件通常是 Web 浏览器向服务器发送请求 , 服务器发回一个响应 。响应通常是 HTML 内容 , 由浏览器来渲染为页面 。样式表 , JavaScript 代码和图像也可以在响应中发送回来以完成整个网页 。每个请求和响应都属于特定的单独的连接的一部分 , 像 Facebook 这样的大型网站为了渲染单个页面实际上可以产生数百个这样的连接 。
AJAX 的工作方式跟这个完全相同 。使用 JavaScript , 开发人员可以向 HTTP 服务器请求一小段信息 , 然后根据响应更新部分页面 。这可以在不刷新浏览器的情况下完成 , 但仍然存在一些限制 。
每个 HTTP 请求/响应的连接在被响应之后都会关闭 , 因此获得任何新的信息必须新建另一个连接 。如果没有新的请求发送给服务器 , 它就不知道客户端正在查找新的信息 。能让 AJAX 应用程序看起来像实时的一种技术是定时循环发送 AJAX 请求 。在设置了时间间隔之后 , 应用程序可以重新将请求发送到服务器 , 以查看是否有任何更新需要反馈给浏览器 。这比较适合小型应用程序 , 但并不高效 。这时候 WebSockets 就派上用场了 。WebSockets 是由 Internet 工程任务组(IETF)创建的建议标准的一部分 。RFC6455 中详细描述了 WebSockets 实现的完整技术规范 。下面是该文档定义 WebSocket 的节选:

WebSocket 协议用于客户端代码和远程主机之间进行通信 , 其中客户端代码是在可控环境下的非授信代码
换句话说 , WebSocket 是一个总是打开的连接 , 允许客户端和服务器自发地来回发送消息 。服务器可在必要时将新信息推送到客户端 , 客户端也可以对服务器执行相同操作 。
JavaScript 中的 WebSockets
大多数现代浏览器都在其 JavaScript 实现中支持 WebSockets 。要从浏览器中启动一个 WebSocket 连接 , 你可以使用简单的 WebSocket JavaScript 对象 , 如下:
您唯一需要的参数是一个 URL , WebSocket 连接可通过此 URL 连接服务器 。该请求实际是一个 HTTP 请求 , 但为了安全连接我们使用“ws://”或“wss://” 。这使服务器知道我们正在尝试创建一个新的 WebSocket 连接 。之后服务器将“升级”该客户端和服务之间的连接到永久的双向连接 。一旦新的 WebSocket 对象被创建 , 并且连接成功创建之后 , 我们就可以使用“send()”方法发送文本到服务器 , 并在 WebSocket 的“onmessage”属性上定义一个处理函数来处理从服务器发送的消息 。具体逻辑会在之后的聊天应用程序代码中解释 。
Go 中的 WebSockets
WebSockets 并不包含在 Go 标准库中 , 但幸运的是有一些不错的第三方包让 WebSockets 的使用轻而易举 。在这个例子中 , 我们将使用一个名为“gorilla/websocket”的包 , 它是流行的 Gorilla Toolkit 包集合的一部分 , 多用于在 Go 中创建 Web 应用程序 。请运行以下命令进行安装:
构建服务器
这个应用程序的第一部分是服务器 。这是一个处理请求的简单 HTTP 服务器 。它将为我们提供 HTML5 和 JavaScript 代码 , 以及建立客户端的 WebSocket 连接 。另外 , 服务器还将跟踪每个 WebSocket 连接并通过 WebSocket 连接将聊天信息从一个客户端发送到所有其他客户端 。首先创建一个新的空目录 , 然后在该目录中创建一个“src”和“public”目录 。在“src”目录中创建一个名为“main.go”的文件 。搭建服务器首先要进行一些设置 。我们像所有 Go 应用程序一样启动应用程序 , 并定义包命名空间 , 在本例中为“main” 。接下来我们导入一些有用的包 。“log”和“net/http”都是标准库的一部分 , 将用于日志记录并创建一个简单的 HTTP 服务器 。最终包“github.com/gorilla/websocket”将帮助我们轻松创建和使用 WebSocket 连接 。


推荐阅读