Golang实现WebSocket服务的项目实践
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun)
我们每天接触到各类应用,如社交、在线文档、直播等,后端都需要使用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.
首先看到第一行(连接成功打印的日志),然后是接收服务端发送的信息。最后关闭服务端程序,客户端打印连接断开日志。
到此这篇关于Golang实现WebSocket服务的项目实践的文章就介绍到这了,更多相关Golang WebSocket服务内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!
相关文章
Go语言LeetCode题解961在长度2N的数组中找出重复N次元素
这篇文章主要为大家介绍了Go语言LeetCode题解961在长度2N的数组中找出重复N次元素示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12利用golang的字符串解决leetcode翻转字符串里的单词
这篇文章主要介绍了利用golang的字符串解决leetcode翻转字符串里的单词,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-12-12
最新评论