广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go 实现 WebSockets之创建 WebSockets
  • 873
分享到

Go 实现 WebSockets之创建 WebSockets

2024-04-02 19:04:59 873人浏览 安东尼
摘要

目录前言建立 Http 服务器发起握手websockets 的用例总结前言 上一篇文章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 为 AndroidiOS、Web 和桌面应用程序提供跨平台支持,WebSockets 常用于以下类型的应用程序:

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

总结

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

您可能感兴趣的文档:

--结束END--

本文标题: Go 实现 WebSockets之创建 WebSockets

本文链接: https://www.lsjlt.com/news/147106.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Go 实现 WebSockets之创建 WebSockets
    目录前言建立 HTTP 服务器发起握手WebSockets 的用例总结前言 上一篇文章Go 实现 WebSockets和什么是 WebSockets我们...
    99+
    2022-11-13
  • Go 实现 WebSockets和什么是 WebSockets
    目录前言什么是 WebSockets网络套接字与 WebSockets套接字通信总结前言 日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启...
    99+
    2022-11-13
  • Go怎么实现WebSockets
    这篇文章主要介绍了Go怎么实现WebSockets的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go怎么实现WebSockets文章都会有所收获,下面我们一起来看看吧。什么是 WebSockets简而言之,We...
    99+
    2023-06-30
  • python websockets实现server和client的通信
    项目地址:https://github.com/aaugustin/websockets 文档地址:https://websockets.readthedocs.io/en/stable/ 1、websockets WebSocket...
    99+
    2023-09-02
    python websocket 服务器 Powered by 金山文档
  • 怎么使用laravel-websockets实现广播系统
    本篇内容介绍了“怎么使用laravel-websockets实现广播系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建项目在 Apach...
    99+
    2023-07-04
  • html5中怎么利用websockets实现全双工通信
    本篇文章为大家展示了html5中怎么利用websockets实现全双工通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、WebSocket握手为了建立WebSo...
    99+
    2022-10-19
  • Redis 的 Pub/Sub如何以WebSockets为前端的类EventMachine实现
    这篇文章给大家介绍Redis 的 Pub/Sub如何以WebSockets为前端的类EventMachine实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  EventMachin...
    99+
    2022-10-19
  • Go Error 嵌套实现创建方式
    目录创建 Errorerrors.New()fmt.Errorf()Wrap Error后记Go Error 的设计哲学是 「Errors Are Values」。 这句话应该怎么理...
    99+
    2022-11-12
  • Go Web实战之创建项目及增加日志功能
    目录回顾一下基础的 Go 项目运行过程创建一些基本的项目功能创建日志接口 LoggerLogger 接口的具体实现测试日志功能总结从本文开始,我们来看一下如何从零搭建一个 Go 项目...
    99+
    2022-11-13
    Go Web增加日志 Go 增加日志 Go Web 日志
  • Go创建Grpc链接池实现过程详解
    目录常规用法创建链接池创建链接池接口实现链接池接口关闭链接扩缩容性能测试常规用法 gRPC 四种基本使用 请求响应模式客户端数据流模式服务端数据流模式双向流模式 常见的gRPC调用...
    99+
    2023-03-03
    Go创建Grpc链接池 Go Grpc
  • C语言之实现栈的基础创建
    栈:是限定仅在表尾进行插入和删除操作的线性表! 栈的结构定义如下: typedef struct Stack { SLDataType *base;//栈底元素的地址 ...
    99+
    2022-11-12
  • Go调度器学习之goroutine调度怎么创建
    今天小编给大家分享一下Go调度器学习之goroutine调度怎么创建的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 协程...
    99+
    2023-07-05
  • Java创建型模式之建造者模式怎么实现
    这篇文章主要介绍了Java创建型模式之建造者模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java创建型模式之建造者模式怎么实现文章都会有所收获,下面我们一起来看看吧。一.介绍建造者模式(Build...
    99+
    2023-07-05
  • Go之集合slice的实现
    目录Slice(切片)基于数组生成切片切片修改切片声明Append切片元素循环Slice(切片) 切片和数组类似,可以把它理解为动态数组。切片是基于数组实现的,它的底层就是一个数组...
    99+
    2022-11-12
  • Android开发之创建可点击的Button实现方法
    本文实例讲述了Android创建可点击的Button实现方法。分享给大家供大家参考,具体如下: 感觉到自己有必要学习下手机开发方面的知识,不论是为了以后的工作需求还是目前的公司...
    99+
    2022-06-06
    button 方法 android开发 Android
  • Qt创建项目实战之手把手创建第一个Qt项目
    目录前言创建项目点击新建按钮选择模板多步骤设置第一步:Location(项目介绍和位置)。第二步:Build System(构建系统)第三步:Details(项目信息)第四步:Tra...
    99+
    2023-05-17
    基于qt的项目 qt新建项目 qt如何创建项目
  • GO语言创建钱包并遍历钱包(wallet)的实现代码
    基本知识 公钥加密算法使用的是成对的密钥:公钥和私钥,公钥可以公开,私钥不能被公开。比特币钱包实际上是一个密钥对,当你安装 一个钱包应用,或者是使用一个比特币客户端来生成一个新地址是...
    99+
    2022-11-12
  • Spring-AOP自动创建代理之BeanNameAutoProxyCreator实例
    实例 代码已托管到Github—> https://github.com/yangshangwei/SpringMaster 在 Spring-AOP 静态普通方法名匹配...
    99+
    2022-11-12
  • 如何使用GO语言创建实时的UNIX Shell?
    在计算机科学领域,Shell是一种与操作系统交互的命令行界面,它使得用户能够与计算机进行交互并执行各种任务。虽然现在有许多现代化的图形界面,但是Shell仍然是许多程序员和系统管理员首选的界面。本文将介绍如何使用GO语言创建实时的UNIX...
    99+
    2023-08-06
    实时 shell unix
  • 操作MySQL实现简单的创建库和创建表
      目录              操作数据库                    创建数据库                    查看数据库                    选择数据库                  ...
    99+
    2023-09-09
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作