• 一、项目引入
  • 二、项目使用
    • 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 小试牛刀相关推荐

  1. go websocket 关闭_Go实战--使用之gorilla/websocket

    声明不止,继续 go go go!!! 关于websocket,不会陌生. 之前也有博客介绍过golang中使用websocket,其中介绍了两个第三方库: gorilla/websocket nko ...

  2. Go WebSocket开发与测试实践【gorilla/websocket】

    文章引用 Golang 官方标准库实现的 websocket 在功能上有些欠缺,本次介绍的 gorilla/websocket库,是Gorilla出品的速度快.质量高,并且被广泛使用的 websock ...

  3. gorilla websocket简易介绍

    以下内容转载自 https://studygolang.com/articles/30074 前言 最近打算为我的网站添加一个服务器资源监视功能,需要服务端主动向前端推动资源占用数据.这时Http则不 ...

  4. golang gorilla websocket例子

    WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. WebSocket通信协议于2011年被IETF定 ...

  5. Go实战--Gorilla web toolkit使用之gorilla/websocket

    声明不止,继续 go go go!!! 关于websocket,不会陌生. 之前也有博客介绍过golang中使用websocket,其中介绍了两个第三方库: gorilla/websocket nko ...

  6. gorilla websocket 实例

    以下内容转自自  https://blog.csdn.net/lanyang123456/article/details/83215220 WebSocket协议是基于TCP的一种新的网络协议.它实现 ...

  7. go gorilla_使用gorilla websocket构建浏览器推送通知服务的低级设计

    go gorilla Singhania AdityaSinghania Aditya Follow跟随 Aug 31 8月31 gopher leaving everyone awestruck w ...

  8. websocket学习笔记 go语言使用 gorilla/websocket实现实时聊天项目

    完整代码:https://github.com/diguacheng/webchat 扩展包 gorilla/websocket的几个重要函数 协议升级 ,1)先初始化upgrader,再调用其upg ...

  9. gorilla websocket无法跨域_聊聊浏览器同源策略与跨域方案详解

    开发出高性能的 Web 应用固然重要,但安全问题也不容小觑.本文我们继续以 HTTP 为线索,展开来讲一讲浏览器安全相关的同源策略. 浏览器的同源策略(Same Origin Policy) 源(Or ...

  10. GO 基于gorilla websocket实现点餐系统(一阶)

    点餐系统(一阶) 简言 一阶为入门,画出大概"轮廓",后面几阶在进行逐步填充,添加细节和上色

最新文章

  1. Python 官方报告:哪些库最受欢迎、PyCharm 比 VScode更香?
  2. Swift使用iconfont图标
  3. 华为访问列表traffic-policy案例
  4. EF(Entity FrameWork)实体框架
  5. mysql5.1修改登陆密码_mysql 5.1版本 修改密码,及远程登录mysql数据库
  6. 【转】SpringMVC Controller 介绍
  7. 如何写_如何写营销软文?
  8. mysql ip 远程连接不上_【技术贴】解决MySql连接不上 ip远程连接Host is not allowed to conn-阿里云开发者社区...
  9. World Wind入门
  10. 关闭Windows10 易升
  11. 工业企业外购材料进项税额的会计处理
  12. 再谈Radmin——对“自己丰衣足食”一文的补充
  13. Generative Adversarial Nets[AAE]
  14. 202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带
  15. Oracle计算分组分位数
  16. 帆软(FineReport)---- 数据决策系统的基本配置
  17. Android拼接合并图片生成长图
  18. 分支预测优化之__builtin_expect
  19. 冬季吃山药能防什么病如何挑选
  20. php上传常见文件类型和$_FILES[file][type]

热门文章

  1. 深度学习里的损失函数与交叉熵
  2. NYOJ题目219-An problem about date
  3. 张正友相机标定法--相机去畸变(C++)
  4. 用python分析拼多多_python:拼多多订单接口api
  5. 单文件浏览器_浏览器工作原理
  6. python处理rgb_如何读取Python中给定像素的RGB值?
  7. centos 7 yum php swoole_自动化部署技能—搭建企业级YUM仓库
  8. 09年职称计算机考试,09年职称计算机考试试题A.doc
  9. 在AppWeb后台,管理员所有数据已经录入完毕,但用手机浏览器登录评委打分界面,发现打分界面为空,或者选手人数不对等问题,如何解决?
  10. php 编译安装参数详解