Golang实现WebSocket服务的项目实践
作者:梦想画家 发布时间:2024-04-28 09:15:51
我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用WebSocket技术提供实时通信能力。本文介绍如何使用Golang实现实时后端WebSocket服务,首先使用Gin框架搭建http服务,然后使用gorilla/websocket库实现简单后端WebSocket服务,示例实现从0到1的过程,适合初学者快速入门。
Gin实现Web应用
创建Go工程,新增hello.go文件,编写下面代码:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
运行可以看到输出结果。下面增加Web服务功能。安装Gin库依赖:
go get -u github.com/gin-gonic/gin
修改上面hello.go文件内容:
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
fmt.Println("Hello, World!")
// 创建Gin引擎实例
r := gin.Default()
// 增加路由ping,简单返回pong
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
// listen and serve on 0.0.0.0:8080
// 启动HTTP服务
r.Run()
}
运行程序,访问地址:http://localhost:8080/ping,返回结果:
{
"message": "pong"
}
实现WebSocket服务
创建server.go,修改hello.go文件的main方法为hello(),同一包下不能有两个main方法。需要安装相应的库:go get -u github.com/gorilla/websocket,增加下面内容:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
// 解决跨域问题
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func ws(c *gin.Context) {
//更新get请求使用WebSocket协议
ws, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
log. Print("upgrade:", err)
return
}
defer ws.Close()
// 监听 ws 消息
for {
// 从 ws 读取数据
mt, message, err := ws.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", message)
//往 ws 写数据
err = ws.WriteMessage(mt, message)
if err != nil {
log.Println("write:", err)
break
}
}
}
func main() {
fmt.Println("Websocket Server!")
r := gin.Default()
r.GET("/ws", ws)
r.Run("localhost:8448")
}
核心逻辑为:收到消息后,往客户端写回相同内容。代码增加了注释,主要差异就是for循环中的读写消息。下面需要html文件进行交互,新建index.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Univer Server</title>
</head>
<body>
<script>
var ws = new WebSocket("ws://localhost:8448/ws");
//打开连接时触发
ws.onopen = function(evt) {
console.log("Connection open...");
ws.send("Hello WebSockets!");
};
//接收到消息时触发
ws.onmessage = function(evt) {
console.log("Received Message: " + evt.data);
};
//连接关闭时触发
ws.onclose = function(evt) {
console.log("Connection closed.");
};
</script>
Hello WebSocket.
</body>
</html>
script标签中定义了三个回调函数,连接ws后给服务端发送消息,服务端收到消息返回相同内容,最后时关闭连接时触发。
启动测试
首先启动ws,go run server.go, 启动服务端后等待客户端连接。下面启动客户端,我们可以使用vs code live server启动访问静态页面,也可以使用python启动http服务。在项目目录下打开命令行界面,输入下面命令,启用http服务:
python -m http.server 9000
通过浏览器访问 http://localhost:9000/index.html , 打开浏览器控制台可以看到信息:
Connection open...
index.html:21 Received Message: Hello WebSockets!
index.html:25 Connection closed.
首先看到第一行(连接成功打印的日志),然后是接收服务端发送的信息。最后关闭服务端程序,客户端打印连接断开日志。
来源:https://blog.csdn.net/neweastsun/article/details/130755719


猜你喜欢
- var iframe = document.createElement("iframe"); iframe.id = &
- 前言: 最近在学习过程中总是遇到np.random.seed()这个问题,刚开始总是觉得不过是一个简单的随机数种子,就没太在意,后来遇到的次
- vue-cli 中可以通过配置 proxyTable 解决开发环境的跨域问题,具体可以参考这篇文章:Vue-cli proxyTable 解
- 我们前面介绍的Selenium的WebDriver测试方法是基于网页来进行的。之前的例子都是用简单的网页来操作,可能体会不到网页的加载过程,
- 文档概览本文基于express、express-session实现了简易的登录/登出功能,完整的代码示例可以在这里找到。环境初始化首先,初始
- 在前面的<如何使用PHP计算上一个月的今天>一文中, 我们提到strtotime函数在使用strtotime(”-1 month
- pymysql 是 python 用来操作MySQL的第三方库,下面具体介绍和使用该库的基本方法。1.建立数据库连接通过 connect 函
- dictPython内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)
- 基于MNIST数据集的逻辑回归模型做十分类任务没有隐含层的Softmax Regression只能直接从图像的像素点推断是哪个数字,而没有特
- 虽然现在的GMail已经看不到这个效果,但之前那个可爱的深红色Loading仍然让许多人喜爱。我也将这款效果融入了我自己的WordPress
- 声明定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。平台:win/I
- 前言本文提供将视频按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考文章:windows ffmp
- Django1.8.2中文文档:Django1.8.2中文文档上传图片配置上传文件保存目录1)新建上传文件保存目录。2)配置上传文件保存目录
- 前言在c++中参数传递有两种形式:值传递和引用传递。这两种方式的区别我不在此说,自行补上,如果你不知道的话。我先上python代码,看完我们
- 我就废话不多说了,大家还是直接看代码吧~package mainimport ("encoding/json""
- 一般事件事件浏览器支持描述onClickHTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事
- function getBytesLength(str){ var re=/[\x00-\xf
- 这里直接给出第一个版本的直接实现:import osimport numpy as npfrom sklearn.cluster impor
- python解决指定代码段超时程序卡死最近我写的一个程序中遇到了解析网页的代码,对于网页信息比较多的可能会超时,最后解析失败,程序卡死,于是
- 为什么很多站长开始做英文网站,我想主要是原因是良好的互联网环境让大家更容易赚到钱,中小站长做英文网站大致为两类,一是电子商务的外贸网站,二是