Golang笔记:使用melody包进行WebSocket通讯

news2024/11/17 23:55:00

文章目录

  • 目的
  • 使用示例与说明
  • 总结

目的

WebSocket是Web开发应用中非常常用的功能,用于客户端和服务器间长时间的实时双向数据通讯。Golang中官方并没有实现这个功能,需要借助第三方的包来实现。

目前被最广泛使用的包是 gorilla/websocket https://pkg.go.dev/github.com/gorilla/websocket 。这个包实现的功能相对来说比较基础,所以也有很多在这之上进行封装的包,比如本文将使用的 olahol/melody https://pkg.go.dev/github.com/olahol/melody 。

这篇文章将简单介绍使用 olahol/melody 包(当前版本为 v1.1.3 )进行WebSocket通讯。

使用示例与说明

olahol/melody 包是自带几个例程的:https://github.com/olahol/melody/tree/master/examples

这里将通过简单的示例介绍下这个包的内容,首先准备两个下面两个文件:

test.go

package main

import (
	"fmt"
	"net/http"

	"github.com/olahol/melody"
)

func main() {
	m := melody.New() // New()方法中也可以配置一些参数

	m.HandleConnect(func(s *melody.Session) {
		fmt.Println("会话连接建立")
		fmt.Println("Session.Request: ", s.Request)
		fmt.Println("Session.Keys: ", s.Keys)
		fmt.Println("LocalAddr: ", s.LocalAddr(), "RemoteAddr: ", s.RemoteAddr())
	})

	m.HandleDisconnect(func(s *melody.Session) {
		fmt.Println("会话连接断开")
	})

	m.HandleError(func(s *melody.Session, err error) {
		fmt.Println("会话出现错误")
		fmt.Println(err)
	})

	m.HandleMessage(func(s *melody.Session, msg []byte) {
		fmt.Println("收到来自客户端的消息: ", string(msg))
		s.Write([]byte("naisu233~~~~")) // 向客户端发送消息
	})

	http.HandleFunc("/ws-m", func(w http.ResponseWriter, r *http.Request) {
		m.HandleRequest(w, r) // 访问 /ws-m 时将转交给melody处理,以实现websocket功能
	})

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		http.ServeFile(w, r, "index.html") // 访问 / 时打开index.html
	})

	http.ListenAndServe(":8080", nil) // 启动服务器,访问 http://localhost:8080/ 进行测试
}

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <script>
        const socket = new WebSocket('ws://localhost:8080/ws-m'); // 创建WebSocket连接

        socket.onopen = (event) => {
            console.log('连接成功');
            socket.send('Hello Naisu!'); // 通过WebSocket向服务器发送消息
        };

        socket.onclose = (event) => {
            console.log('连接被关闭');
        };

        socket.onerror = (event) => {
            console.log('连接因错误而关闭');
        };

        socket.onmessage = (event) => {
            console.log('收到数据: ', event.data);  // 打印来自服务器的消息
        };

        setTimeout(() => {
            socket.close(); // 关闭当前连接
        }, 3000);
    </script>
</body>
</html>

在这里插入图片描述

上面的例子展现了WebSocket客户端和服务器整个连接通讯的流程,及相关内容:

  • 对于WebSocket而言主要的有 连接 / 断开 / 错误 / 收到消息 这四个事件。
  • melody.Session 是客户端对象的会话,保存了特定客户端相关的内容;
  • melody.Session.Keys 中可以用来临时记录一些客户信息,使用 (s) Set(key, value) 方法设置其中内容,使用 (s) Get(key) 方法获取设置的内容;
  • 可以使用 melody.SessionWriteWriteBinary 方法向客户端发送消息;
  • 可以使用 melodyfunc (m *Melody) Sessions() ([]*Session, error) 方法获取所有的 Session

WebSocket除了上面单点的发送消息外,作为服务器还可以向所有已连接的客户端广播消息:

test.go

package main

import (
	"net/http"

	"github.com/olahol/melody"
)

func main() {
	m := melody.New() // New()方法中也可以配置一些参数

	m.HandleMessage(func(s *melody.Session, msg []byte) {
		m.Broadcast(msg) // 向所有客户端广播消息
	})

	http.HandleFunc("/ws-m", func(w http.ResponseWriter, r *http.Request) {
		m.HandleRequest(w, r) // 访问 /ws-m 时将转交给melody处理,以实现websocket功能
	})

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		http.ServeFile(w, r, "index.html") // 访问 / 时打开index.html
	})

	http.ListenAndServe(":8080", nil) // 启动服务器,访问 http://localhost:8080/ 进行测试
}

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <input type="text" placeholder="输入内容并回车" >
    <pre></pre>
    <script>
        const socket = new WebSocket('ws://localhost:8080/ws-m'); // 创建WebSocket连接

        socket.onmessage = (event) => { // 收到来自服务器的WebSocket消息
            document.querySelector('pre').innerText += event.data + '\n';
        };

        document.querySelector('input').onkeydown = (event) => {
            if (event.keyCode === 13) { // 如果按下的是回车键
                socket.send(document.querySelector('input').value);
            }
        };
    </script>
</body>
</html>

在这里插入图片描述

上面演示中向所有客户端广播了消息,事实上 olahol/melody 包中还有很多广播方法,可以精细的控制向指定的一些客户端广播消息,更多内容可以参考官方文档。

总结

使用melody包进行WebSocket通讯操作上是比较简单的,总体使用上不会存在障碍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Host头攻击

转载与&#xff1a;https://blog.csdn.net/weixin_47723270/article/details/129472716 01 HOST头部攻击漏洞知识 Host首部字段是HTTP/1.1新增的&#xff0c;旨在告诉服务器&#xff0c;客户端请求的主机名和端口号&#xff0c;主要用来实现虚拟主机技术。 运用虚拟主机技术&a…

第八章:C语言的简单指针

谈起指针&#xff0c;简直就是谈虎色变&#xff0c;学习C语言的人都知道&#xff0c;指针的难度&#xff0c;就好像高中的导数一样&#xff0c;难道离谱&#xff0c;但是但是&#xff0c;别慌呀&#xff0c;咱们慢慢来&#xff0c;空杯心态&#xff0c;一步一个脚印&#xff0c…

【STM32】STM32使用继电器

STM32使用继电器 其实继电器简单来说就是一个开关&#xff0c;VCC表示电源正极、GND表示电源负极、IN表示信号输入脚&#xff0c;COM表示公共端&#xff0c;NC&#xff08;normal close&#xff09;表示常闭端&#xff0c;NO(normal open)表示常开端。一般情况下是常闭状态。 …

为数字人充值AI情商 小冰“克隆人”要卖给谁?

近日&#xff0c;小冰公司启动“GPT克隆人计划”&#xff0c;据悉最短只要采集三分钟数据&#xff0c;就能帮助用户创造源于本人性格、技能、声音、外貌的AI克隆人&#xff0c;如同拥有“平行世界的第二人生”。 这不免让人想起了《流浪地球2》里华仔为剧中女儿“数字续命”的…

chatgpt赋能Python-python3_2__1

Python3-2<<1&#xff1a; 了解运算符的使用和优先级 Python是一种优雅而高效的编程语言&#xff0c;而Python3-2<<1是一个关于运算符优先级的例子&#xff0c;值得我们深入探讨。 在这篇文章中&#xff0c;我们将介绍Python3中运算符的优先级&#xff0c;并对其中…

chatgpt赋能Python-python3_6怎么用

Python3.6是什么&#xff1f; Python是一种非常流行的编程语言&#xff0c;旨在提供简洁、易读且易于维护的代码。Python3.6是该语言的下一个主要版本&#xff0c;带来了一些改进并改进了现有功能&#xff0c; Python3.6有哪些新特性&#xff1f; 字典内置方法&#xff0c;支…

chatgpt赋能Python-python3_53怎么安装

Python3.5.3安装方法及注意事项 Python是一种高级编程语言&#xff0c;被广泛应用于科学&#xff0c;数学&#xff0c;机器学习等领域。在本文中&#xff0c;我们将介绍如何安装Python 3.5.3版本&#xff0c;并提供注意事项以确保安装过程顺利进行。 步骤1&#xff1a;下载Py…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实…

java企业车辆管理系统myeclipse定制开发mysql数据库网页模式java编程jdbc

一、源码特点 java企业车辆管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助 mysql数据库&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 java企业车辆管理系统myeclipse定制开发mysql 二、功能介绍 此次系统…

navicat连接mysql数据库密码忘记了快速找回

本机环境&#xff1a; mac 12.2.1 mysql8.0.3 问题&#xff1a; 连接navicat时&#xff0c;报错Access denied for user ‘root‘‘localhost‘ (using password: YES) 解决&#xff1a; 1.在navicat中导出xxx.ncx文件 勾选Export Password&#xff0c;选择要输出的文件目录…

nvidia-smi 参数详解

nvidia-smi 参数详解 参数详情GPU本机中的GPU编号&#xff0c;有多块显卡的时候从0开始&#xff0c;图中的GPU编号为0Fan风扇转速&#xff0c;N/A表示没有风扇NameGPU类型&#xff0c;图中GPU为NVIDIA GeForce GTX 1050TiTempGPU温度PerfGPU性能状态&#xff0c;从P0(最大性能)…

视频怎么转化为mp3,5种高效方法任选

视频怎么转化为mp3呢&#xff1f;想必这是我们工作过程中经常遇见的问题。众所周知&#xff0c;MP3格式是一种常见的音频格式&#xff0c;支持多种音频播放器和设备。通过将视频转换为MP3格式&#xff0c;用户可以方便地将视频的音频部分提取出来&#xff0c;保存为与视频大小不…

ChatGPT Plugin已正式上线 - 如何优先使用?

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

KDE Frameworks 5.106改进了Breeze图标、Plasma浏览器集成等功能

导读KDE项目今天发布了KDE Frameworks 5.106&#xff0c;作为KDE Frameworks 5的另一个月度更新&#xff0c;该集合有80多个Qt的附加库&#xff0c;为KDE Plasma桌面环境和KDE Gear软件套件提供通用功能。 主要的KDE Frameworks 6系列的工作仍在继续&#xff0c;但这并不意味着…

指数加权平均值滤波Exponential Weighting Method(博途SCL功能块)

在了解指数加权均值滤波算法之前大家可以熟悉下滑动平均值滤波(Lamuda=1.0时,指数加权滤波和滑动平均值滤波算法一模一样),滑动平均值滤波算法的详细介绍,请参看下面文章博客,这里不再赘述。 博途PLC各种平均值滤波算法对比(SCL+梯形图代码)_博途数字滤波梯形图_RXXW_…

如何在金融行业运用IPD?

随着经济体制和金融体制朝市场化方向的不断发展&#xff0c;我国金融市场建设取得了突破性进展。我国金融机构规模不断扩大&#xff0c;不仅种类非常齐全&#xff0c;市场参与主体日趋广泛&#xff0c;极大地满足了人们日益增长的金融需求。基本形成了初具规模、分工明确的市场…

Word如何设置页码?3个简单方法快速设置!

案例&#xff1a;Word如何设置页码 【在使用word文档时&#xff0c;由于页数太多了&#xff0c;想给文档设置页码&#xff0c;但是不知道该如何设置&#xff1f;请大家帮帮我&#xff01;】 对于经常使用word进行办公的朋友来说&#xff0c;设置页码应该是个比较常见的需求了…

电脑怎么截图?常见的4种截图方法分享!

案例&#xff1a;有人知道在电脑上怎么截图&#xff1f; 【有时候&#xff0c;用截图表达事情会更加清楚&#xff0c;但是我只会手机截图&#xff0c;不知道在电脑上怎么截图。有没有小伙伴知道电脑怎么截图&#xff1f;】 在日常使用电脑时&#xff0c;我们经常需要截图来记…

git关于本地仓库、版本库、工作区、暂存区、远程仓库、分支

项目开发git版本管控目录大致如下&#xff1a; 1、.git 文件夹 详细内容参考博文&#xff1a;.git文件夹详解 .git文件夹详解 - 程序员大本营 用来管理git仓库的文件夹&#xff0c;里面内容较多&#xff0c;包括暂存区和本地库都在文件夹中&#xff1b; 创建方式&#xff1a;…

四信5G RedCap产品发布,加速行业迈向5G“轻时代”

RedCap(Reduced Capability)即缩减能力&#xff0c;属于轻量化5G的重要组成部分&#xff0c;也是蜂窝物联网的重要演进方向&#xff0c;RedCap自诞生以来备受产业关注&#xff0c;为5G设备带来更低成本、更低功耗、更小型化的应用前景&#xff0c;进一步提升5G应用于垂直行业市…