Go 实现 WebSockets之创建 WebSockets
作者:宇宙之一粟 发布时间:2024-05-09 09:30:36
前言
上一篇文章Go 实现 WebSockets和什么是 WebSockets我们先介绍了什么是 WebSockets 协议。本篇文章将来介绍如何利用 Go 来实现一个 WebSockets。要基于 net/http 库编写一个简单的 WebSocket 响应服务器,我们需要:
建立握手
从客户端接收数据帧
向客户端发送数据帧
关闭握手
WebSockets 无需客户端事先请求即可从服务器传输数据,允许来回传递消息并保持连接打开,直到客户端或服务器终止它。因此,可以在客户端和服务器之间进行双向实时数据传输。 WebSocket 通信通常通过 TCP 端口号 443 完成。
WebSocket 协议规范定义了两种 URI 方案:
WebSocket (ws):用于非加密连接
WebSocket Secure (wss):用于加密连接
建立 HTTP 服务器
WebSockets 建立在 HTTP 之上,所以首先,我们将设置一个基本的 HTTP 服务器,它可以接受客户端连接并提供消息。将以下代码添加到我们的 ??server.go?
? 文件中:
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the server!\n")
})
http.ListenAndServe(":8080", nil)
}
通过运行 ??go run server.go?
?? 启动服务器。当您访问 ??localhost:8080?
? 时,您应该会看到以下输出:
Welcome to the server!
发起握手
由于开销较小,WebSocket 可以在 Web 服务器和 Web 浏览器或客户端应用程序之间实现实时通信和快速数据传输。 WebSocket 通信发起一个握手,它使用 HTTP Upgrade() 标头从 HTTP 协议更改为 WebSocket 协议。
要建立 WebSocket 连接,需要在客户端和服务器之间进行一次握手。握手使用 Upgrade() 方法将 HTTP 服务器连接升级到 WebSocket 协议。一旦服务器停止,我们还将使用 defer 关闭连接。
现在,我们修改 ??server.go?
? 文件,建立一个 WebSocket 握手:
首先,我们需要获取??gorilla/websocket?
? 库:
$ go get github.com/gorilla/websocket
定义一个 upgrader 结构,用来保存 WebSocket 连接的读取和写入缓冲区大小等信息:
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
然后更改??server.go?
? 代码:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func main() {
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil) // error ignored for sake of simplicity
for {
// Read message from browser
msgType, msg, err := conn.ReadMessage()
if err != nil {
return
}
// Print the message to the console
fmt.Printf("%s sent: %s\n", conn.RemoteAddr(), string(msg))
// Write message back to browser
if err = conn.WriteMessage(msgType, msg); err != nil {
return
}
}
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "websockets.html")
})
http.ListenAndServe(":8080", nil)
}
新建一个??websockets.html?
? 文件,写入如下代码:
<!-- websockets.html -->
<input id="input" type="text" />
<button onclick="send()">Send</button>
<pre id="output"></pre>
<script>
var input = document.getElementById("input");
var output = document.getElementById("output");
var socket = new WebSocket("ws://localhost:8080/echo");
socket.onopen = function () {
output.innerHTML += "Status: Connected\n";
};
socket.onmessage = function (e) {
output.innerHTML += "Server: " + e.data + "\n";
};
function send() {
socket.send(input.value);
input.value = "";
}
</script>
运行??go run server.go?
? 文件
打开浏览器,输入??http://localhost:8080/?
? ,然后就能看到如下界面:
当我们向服务器输入hello 后,然后单击??Send?
? 按钮。
界面如下:
回到服务器终端也能看到如下信息:
$ go run server.go
[::1]:58036 sent: Hello
至此,一个简单的 WebSockets 就完全实现了。接下来,我们看一下 WebSockets 有哪些实际运用。
WebSockets 的用例
因为 WebSockets
的主要目的是支持全双工或双向通信。除了提供实时更新外,WebSockets 还包括一个可以支持多个打开的 WebSocket 连接的轻量级服务器。与大多数其他方法相比,WebSockets 可以在更长的时间内维持客户端和服务器之间的连接。
目前,WebSockets 为 Android、iOS、Web 和桌面应用程序提供跨平台支持,WebSockets 常用于以下类型的应用程序:
实时消息
多人游戏
实时比分提要
协作编辑工具
实时位置和方向应用
使用 WebRTC 进行音频和视频聊天
来源:https://blog.51cto.com/yuzhou1su/5190020?b=totalstatistic


猜你喜欢
- 实例如下所示:# -*- coding:utf-8 -*-__author__ = 'kingking'__version_
- Python中的random模块用于生成随机数,它提供了很多函数。常用函数总结如下:1. random.random()用于生成一个0到1的
- Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。 还要创建另外一个表[Audit]
- 在接口测试学习过程中,遇到了利用requests库进行文件下载和上传的问题。同样,在真正的测试过程中,我们不可避免的会遇到上传和下载的测试。
- pytorch中index_select()的用法index_select(input, dim, index)功能:在指定的维度dim上选
- 目录一、ACID 特性二、事务控制语法三、事务并发异常1、脏读2、不可重复读3、幻读四、事务隔离级别一、ACID 特性事务处理是一种对必须整
- 前言本章我们来介绍如何使用Pytorch训练一个区分不同音频的分类模型,例如你有这样一个需求,需要根据不同的鸟叫声识别是什么种类的鸟,这时你
- 1.init 函数简介Golang init 函数是一种特殊的函数,主要用于完成程序的初始化工作,如初始化数据库的连接、载入本地配置文件、根
- 首先关键一句话:$(".js-example-tags").select2({ tags:
- python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差。“一行代
- --利用T-SQL语句,实现数据库的备份与还原的功能 ----体现了SQL Server中的四个知识点: ----1. 获取SQL Serv
- 本文用的是sciki-learn库的iris数据集进行测试。用的模型也是最简单的,就是用贝叶斯定理P(A|B) = P(B|A)*P(A)/
- 受<! #include file="filename.asp" --> 宏限制必须存在该文件并且会预先编译
- linux平台及windows平台mysql重启方 * inux下重启MySQL的正确方法:1、通过rpm包安装的MySQLservice m
- MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序。EVENT由其名称和所在的s
- 本文为大家分享了mysql 8.0.12的 安装教程,供大家参考,具体内容如下安装教程环境:系统:Windows8.1安装包:mysql-8
- 额额,标题已经很醒目了,通过中间件去实现,其他方法也可以实现浏览器前端传来的请求,必须通过中间件,才能到后面路由,视图函数,所以我们在中间件
- 这篇文章主要介绍了如何使用Python抓取网页tag操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 前言1.装饰器本质是一个语法糖,是对被装饰方法或类进行的功能扩充,是一种面向切面的实现方法2.装饰器可以分成方法装饰器和类装饰器,他们的区别
- 对于中小型个人、企业网站来说,MySQL数据库或许是目前数据库的最完美实施解决方案了。在不变更服务器硬件的前提下,一个经过良好架构,优化后的