Go gorilla websocket 小试牛刀
- 一、项目引入
- 二、项目使用
- 1、根目录 GoWebsocket 下新建 go.mod 文件
- 2、go build 构建项目
- 3、go run 入口文件,执行项目
- 4、执行 client.html 文件
- 5、其他
- 三、初始文件代码
- 1、connection.go
- 2、client.html
- 3、server.go
- 四、相关地址
一、项目引入
项目结构很简单,只有3个文件,大家可以把这三个文件排版成这种格式,然后导入。
- 三个文件详见
步骤3
- 如果大家觉得下载太麻烦,那就去
步骤四
直接下载代码 https://gitee.com/yinleilei/GoWebsocket,记得把server.go
第四行"**/**/impl"
,改成你在mod.go
中设置的名字
- 三个文件详见
关于怎么用Goland新建一个已有的项目,请查看我这一篇 GoLand添加一个已有项目的相关配置
二、项目使用
1、根目录 GoWebsocket 下新建 go.mod 文件
- 由于我新建的是一个
Go Mosules ( vgo )
类型的项目,所以要在根目录GWebsocket
下加一个go.mod
文件 - go.mod 内容如下:定义项目的模块名称
module GoWebsocket
2、go build 构建项目
- 如果没创建go.mod文件就执行
go build
,报错如下:
go: cannot find main module; see 'go help modules'
go build
命令构建项目,在 GoLand添加一个已有项目的相关配置 已经设置了go第三方包自动导入
,所以可以看到已经成功引入了第三方扩展,如图:
大家同时可以看到 根目录
GoWebsocket
下生成了2
个新文件
,如图
go.sum
:标记每个依赖包的版本 【Go专家编程】一文搞懂go.sum工作机制
GoWebsocket.exe
:可执行文件
3、go run 入口文件,执行项目
go run server.go
命令启动项目
弹窗网络安全提示:选择允许访问
,如图
程序没报错
,没结束
,说明在执行中,如图
4、执行 client.html 文件
GoLang中选择 client.html 文件,选择一种浏览器打开,如图
浏览器打开后,点击操作按钮打开
,关闭
,发送
,打印效果,如图
5、其他
- 1)、mod.go 中定义的模块
GoWebsocket
,在server.go
中引入impl
下的所有文件中用到了
import ("GoWebsocket/impl""net/http""time""github.com/gorilla/websocket"
)
- 2)、如果修改了服务端代码,请务必重启服务,重启命令为
go run 入口文件
go run server.go
三、初始文件代码
1、connection.go
package mainimport ("GoWebsocket/impl""net/http""time""github.com/gorilla/websocket"
)var (upgrader = websocket.Upgrader{//允许跨域CheckOrigin: func(r *http.Request) bool {return true},}
)func wsHandler(w http.ResponseWriter, r *http.Request) {var (wsConn *websocket.Connerr errordata []byteconn *impl.Connection)//Upgrade字段:websocketif wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {return}if conn, err = impl.InitConnection(wsConn); err != nil {goto ERR}/**这个是发送心跳*/go func() {var (err error)for {if err = conn.WriteMessage([]byte("心跳")); err != nil {return}time.Sleep(1 * time.Second)}}()for {if data, err = conn.ReadMessage(); err != nil {goto ERR}if err = conn.WriteMessage(data); err != nil {goto ERR}}ERR:conn.Close()
}func main() {http.HandleFunc("/ws", wsHandler)http.ListenAndServe(":8888", nil)
}
2、client.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>websocket实现消息推送</title><script>window.addEventListener("load",function (event) {let output = document.getElementById("output")let input = document.getElementById("input")let wslet print = function (message) {let d=document.createElement("div")d.innerHTML = messageoutput.appendChild(d)}document.getElementById("open").onclick = function (event) {if(ws){return false}ws = new WebSocket("ws://localhost:8888/ws")ws.onopen = function (event) {print("打开")}ws.onclose = function (event) {print("关闭")ws = null}ws.onmessage = function (event) {print("响应:"+event.data)}ws.onerror = function (event) {print("错误:"+event.data)}return false}document.getElementById("send").onclick = function (event) {if(!ws){return false}print("发送:"+input.value)ws.send(input.value)return false}document.getElementById("close").onclick = function (event) {ws.close()return false}})</script>
</head>
<body><table><tr><td valign="top" width="50%"><p>点击:<br>“打开”和服务端创建一个连接。<br>"发送"发送一个消息给服务端。<br>"关闭"去关闭连接.<br>你可以改变消息Message并且发送多次.<br></p><form><button id="open">打开</button><button id="close">关闭</button><br><input id="input" type="text" value="Websocket —— Go"><button id="send">发送</button><br></form></td><td valign="top" width="50%"><div id="output"></div></td></tr></table></body>
</html>
3、server.go
package mainimport ("GoWebsocket/impl""net/http""time""github.com/gorilla/websocket"
)var (upgrader = websocket.Upgrader{//允许跨域CheckOrigin: func(r *http.Request) bool {return true},}
)func wsHandler(w http.ResponseWriter, r *http.Request) {var (wsConn *websocket.Connerr errordata []byteconn *impl.Connection)//Upgrade字段:websocketif wsConn, err = upgrader.Upgrade(w, r, nil); err != nil {return}if conn, err = impl.InitConnection(wsConn); err != nil {goto ERR}/**这个是发送心跳*/go func() {var (err error)for {if err = conn.WriteMessage([]byte("心跳")); err != nil {return}time.Sleep(1 * time.Second)}}()for {if data, err = conn.ReadMessage(); err != nil {goto ERR}if err = conn.WriteMessage(data); err != nil {goto ERR}}ERR:conn.Close()
}func main() {http.HandleFunc("/ws", wsHandler)http.ListenAndServe(":8888", nil)
}
四、相关地址
- github地址:github.com/gorilla/websocket
- Go: WebSocket实现消息推送,这篇博客最下面,分享了一个代码地址,如下
- https://gitee.com/yinleilei/GoWebsocket
- 我发现这个视频的代码跟这里一样:封装Websocket
Go gorilla websocket 小试牛刀相关推荐
- go websocket 关闭_Go实战--使用之gorilla/websocket
声明不止,继续 go go go!!! 关于websocket,不会陌生. 之前也有博客介绍过golang中使用websocket,其中介绍了两个第三方库: gorilla/websocket nko ...
- Go WebSocket开发与测试实践【gorilla/websocket】
文章引用 Golang 官方标准库实现的 websocket 在功能上有些欠缺,本次介绍的 gorilla/websocket库,是Gorilla出品的速度快.质量高,并且被广泛使用的 websock ...
- gorilla websocket简易介绍
以下内容转载自 https://studygolang.com/articles/30074 前言 最近打算为我的网站添加一个服务器资源监视功能,需要服务端主动向前端推动资源占用数据.这时Http则不 ...
- golang gorilla websocket例子
WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...
- Go实战--Gorilla web toolkit使用之gorilla/websocket
声明不止,继续 go go go!!! 关于websocket,不会陌生. 之前也有博客介绍过golang中使用websocket,其中介绍了两个第三方库: gorilla/websocket nko ...
- gorilla websocket 实例
以下内容转自自 https://blog.csdn.net/lanyang123456/article/details/83215220 WebSocket协议是基于TCP的一种新的网络协议.它实现 ...
- go gorilla_使用gorilla websocket构建浏览器推送通知服务的低级设计
go gorilla Singhania AdityaSinghania Aditya Follow跟随 Aug 31 8月31 gopher leaving everyone awestruck w ...
- websocket学习笔记 go语言使用 gorilla/websocket实现实时聊天项目
完整代码:https://github.com/diguacheng/webchat 扩展包 gorilla/websocket的几个重要函数 协议升级 ,1)先初始化upgrader,再调用其upg ...
- gorilla websocket无法跨域_聊聊浏览器同源策略与跨域方案详解
开发出高性能的 Web 应用固然重要,但安全问题也不容小觑.本文我们继续以 HTTP 为线索,展开来讲一讲浏览器安全相关的同源策略. 浏览器的同源策略(Same Origin Policy) 源(Or ...
- GO 基于gorilla websocket实现点餐系统(一阶)
点餐系统(一阶) 简言 一阶为入门,画出大概"轮廓",后面几阶在进行逐步填充,添加细节和上色
最新文章
- Python 官方报告:哪些库最受欢迎、PyCharm 比 VScode更香?
- Swift使用iconfont图标
- 华为访问列表traffic-policy案例
- EF(Entity FrameWork)实体框架
- mysql5.1修改登陆密码_mysql 5.1版本 修改密码,及远程登录mysql数据库
- 【转】SpringMVC Controller 介绍
- 如何写_如何写营销软文?
- mysql ip 远程连接不上_【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn-阿里云开发者社区...
- World Wind入门
- 关闭Windows10 易升
- 工业企业外购材料进项税额的会计处理
- 再谈Radmin——对“自己丰衣足食”一文的补充
- Generative Adversarial Nets[AAE]
- 202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带
- Oracle计算分组分位数
- 帆软(FineReport)---- 数据决策系统的基本配置
- Android拼接合并图片生成长图
- 分支预测优化之__builtin_expect
- 冬季吃山药能防什么病如何挑选
- php上传常见文件类型和$_FILES[file][type]
热门文章
- 深度学习里的损失函数与交叉熵
- NYOJ题目219-An problem about date
- 张正友相机标定法--相机去畸变(C++)
- 用python分析拼多多_python:拼多多订单接口api
- 单文件浏览器_浏览器工作原理
- python处理rgb_如何读取Python中给定像素的RGB值?
- centos 7 yum php swoole_自动化部署技能—搭建企业级YUM仓库
- 09年职称计算机考试,09年职称计算机考试试题A.doc
- 在AppWeb后台,管理员所有数据已经录入完毕,但用手机浏览器登录评委打分界面,发现打分界面为空,或者选手人数不对等问题,如何解决?
- php 编译安装参数详解