我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go 实现 WebSockets之创建 WebSockets

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go 实现 WebSockets之创建 WebSockets

前言

上一篇文章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!

Go 实现 WebSockets:2. Go 创建 WebSockets_客户端_02

发起握手

由于开销较小,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/​​ ,然后就能看到如下界面:

Go 实现 WebSockets:2. Go 创建 WebSockets_客户端_03

当我们向服务器输入hello 后,然后单击​​Send​​ 按钮。

界面如下:

Go 实现 WebSockets:2. Go 创建 WebSockets_客户端_04

回到服务器终端也能看到如下信息:

$ go run server.go
[::1]:58036 sent: Hello

至此,一个简单的 WebSockets 就完全实现了。接下来,我们看一下 WebSockets 有哪些实际运用。

WebSockets 的用例

因为 WebSockets 的主要目的是支持全双工或双向通信。除了提供实时更新外,WebSockets 还包括一个可以支持多个打开的 WebSocket 连接的轻量级服务器。与大多数其他方法相比,WebSockets 可以在更长的时间内维持客户端和服务器之间的连接。

目前,WebSockets 为 Android、iOS、Web 和桌面应用程序提供跨平台支持,WebSockets 常用于以下类型的应用程序:

  • 实时消息
  • 多人游戏
  • 实时比分提要
  • 协作编辑工具
  • 实时位置和方向应用
  • 使用 WebRTC 进行音频和视频聊天

总结

在本文中,我们探索了 WebSockets,并简要介绍了它们的工作原理,并仔细研究了全双工通信。为了了解 WebSocket 在 Go 中的工作原理,我们构建了一个简单的待办事项应用程序,该应用程序具有添加和删除任务的功能。最后,我们查看了使 WebSockets 有用和通用的几个附加特性,并回顾了 WebSockets 的一些实际应用。在 Go 中使用 WebSockets 相当简单明了,但这种组合会对应用程序的性能产生显着影响。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go 实现 WebSockets之创建 WebSockets

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go怎么实现WebSockets

这篇文章主要介绍了Go怎么实现WebSockets的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go怎么实现WebSockets文章都会有所收获,下面我们一起来看看吧。什么是 WebSockets简而言之,We
2023-06-30

如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker

php小编苹果今天为大家介绍一种使用Gorilla Websockets和alexedwards/scs/v2库来实现http.Hijacker的方法。这种方法可以帮助开发者在自己的应用程序中实现实时通信的功能,无论是聊天室还是实时更新等场
如何使用 Gorilla Websockets 和 alexedwards/scs/v2 实现 http.Hijacker
2024-02-10

怎么使用laravel-websockets实现广播系统

本篇内容介绍了“怎么使用laravel-websockets实现广播系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建项目在 Apach
2023-07-04

如何在 Golang 中使用 WebSockets 实现文件上传?

在 golang 中使用 websockets 实现文件上传,需要引入 "github.com/gorilla/websocket" 包,设置 websocket 路由和处理函数。使用 gorrila websocket 库升级 http
如何在 Golang 中使用 WebSockets 实现文件上传?
2024-05-13

python中websockets与主线程传递参数的实现

Python中WebSockets与主线程传递参数可通过线程安全变量实现,如队列、事件信号和可重入锁。队列可用于传递数据,事件信号可用于发送信号触发操作,可重入锁可保护对共享数据的访问。使用这些方法可以安全且有效地实现WebSockets与主线程之间的参数传递。
python中websockets与主线程传递参数的实现
2024-04-02

如何在Bokeh中使用回调和WebSockets实现服务器和客户端之间的实时通信

在Bokeh中使用回调和WebSockets实现服务器和客户端之间的实时通信可以通过以下步骤完成:创建一个Bokeh服务器应用程序,并在应用程序中添加一个具有回调功能的图表或小部件。在Bokeh服务器应用程序中使用WebSockets创建一
如何在Bokeh中使用回调和WebSockets实现服务器和客户端之间的实时通信
2024-05-21

Go创建Grpc链接池实现过程详解

这篇文章主要为大家介绍了Go创建Grpc链接池实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-03

Go Web实战之创建项目及增加日志功能

这篇文章主要为大家详细介绍了Go Web项目中如何实现创建项目及增加日志功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-11-13

使用Go语言创建Web应用:简便实现

有志者,事竟成!如果你在学习Golang,那么本文《使用Go语言创建Web应用:简便实现》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~Go语言是一种开源的编程语言,它以其高效的
使用Go语言创建Web应用:简便实现
2024-04-04

Java创建型模式之建造者模式怎么实现

这篇文章主要介绍了Java创建型模式之建造者模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java创建型模式之建造者模式怎么实现文章都会有所收获,下面我们一起来看看吧。一.介绍建造者模式(Build
2023-07-05

Android开发之创建可点击的Button实现方法

本文实例讲述了Android创建可点击的Button实现方法。分享给大家供大家参考,具体如下: 感觉到自己有必要学习下手机开发方面的知识,不论是为了以后的工作需求还是目前的公司项目。 当然,任何新东西的开始,必然伴随着第一个HelloWor
2022-06-06

Go调度器学习之goroutine调度怎么创建

今天小编给大家分享一下Go调度器学习之goroutine调度怎么创建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 协程
2023-07-05

pycharm怎么实现创建表格_pycharm实现创建表格的方法

首先打开pycharm工具。再点击file,创建python项目。导入python的docx库。接着创建document对象。再创建table表格。最后用text向表格输入数据。以上就是pycharm怎么实现创建表格_pycharm实现创
pycharm怎么实现创建表格_pycharm实现创建表格的方法
2024-05-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录