WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。

在golang语言中,目前有两种比较常用的实现方式:一个是golang自带的库,另一个是gorilla,功能强大。

golang自带库的使用例子可参考以前的博文:Golang如何使用websocket

本文以gorilla为例,介绍websocket的使用。

下载gorilla

# go get github.com/gorilla/websocket

下面例子中主要包括两部分,server和client。
client部分又包括:web client(浏览器)和非web client。

server

server端是一个HTTP 服务器,监听8080端口。

当接收到连接请求后,将连接使用的http协议升级为websocket协议。后续通信过程中,使用websocket进行通信。

对每个连接,server端等待读取数据,读到数据后,打印数据,然后,将数据又发送给client.

server启动方式

# go run server.go

server.go代码如下:

// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.// +build ignorepackage mainimport ("flag""html/template""log""net/http""github.com/gorilla/websocket"
)var addr = flag.String("addr", "localhost:8080", "http service address")var upgrader = websocket.Upgrader{} // use default optionsfunc echo(w http.ResponseWriter, r *http.Request) {c, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Print("upgrade:", err)return}defer c.Close()for {mt, message, err := c.ReadMessage()if err != nil {log.Println("read:", err)break}log.Printf("recv: %s", message)err = c.WriteMessage(mt, message)if err != nil {log.Println("write:", err)break}}
}func home(w http.ResponseWriter, r *http.Request) {homeTemplate.Execute(w, "ws://"+r.Host+"/echo")
}func main() {flag.Parse()log.SetFlags(0)http.HandleFunc("/echo", echo)http.HandleFunc("/", home)log.Fatal(http.ListenAndServe(*addr, nil))
}var homeTemplate = template.Must(template.New("").Parse(`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
window.addEventListener("load", function(evt) {var output = document.getElementById("output");var input = document.getElementById("input");var ws;var print = function(message) {var d = document.createElement("div");d.innerHTML = message;output.appendChild(d);};document.getElementById("open").onclick = function(evt) {if (ws) {return false;}ws = new WebSocket("{{.}}");ws.onopen = function(evt) {print("OPEN");}ws.onclose = function(evt) {print("CLOSE");ws = null;}ws.onmessage = function(evt) {print("RESPONSE: " + evt.data);}ws.onerror = function(evt) {print("ERROR: " + evt.data);}return false;};document.getElementById("send").onclick = function(evt) {if (!ws) {return false;}print("SEND: " + input.value);ws.send(input.value);return false;};document.getElementById("close").onclick = function(evt) {if (!ws) {return false;}ws.close();return false;};
});
</script>
</head>
<body>
<table>
<tr><td valign="top" width="50%">
<p>Click "Open" to create a connection to the server,
"Send" to send a message to the server and "Close" to close the connection.
You can change the message and send multiple times.
<p>
<form>
<button id="open">Open</button>
<button id="close">Close</button>
<p><input id="input" type="text" value="Hello world!">
<button id="send">Send</button>
</form>
</td><td valign="top" width="50%">
<div id="output"></div>
</td></tr></table>
</body>
</html>
`))

server output:

recv: 2018-10-20 17:09:12.497129965 +0800 CST m=+1.010137585
recv: 2018-10-20 17:09:13.495602484 +0800 CST m=+2.008641088
recv: 2018-10-20 17:09:14.49401062 +0800 CST m=+3.007080206
recv: 2018-10-20 17:09:15.497114615 +0800 CST m=+4.010215329
recv: 2018-10-20 17:09:16.494394706 +0800 CST m=+5.007526368
read: websocket: close 1000 (normal)

非web client

client启动后,首先连接server。

连接建立后,主routine每一秒钟向server发送消息(当前时间)。

另一个routine从server接收数据,并打印。

当client退出时,会向server发送关闭消息。接着,等待退出。

client启动方式

# go run client.go

client代码如下:

// Copyright 2015 The Gorilla WebSocket Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.// +build ignorepackage mainimport ("flag""log""net/url""os""os/signal""time""github.com/gorilla/websocket"
)var addr = flag.String("addr", "localhost:8080", "http service address")func main() {flag.Parse()log.SetFlags(0)interrupt := make(chan os.Signal, 1)signal.Notify(interrupt, os.Interrupt)u := url.URL{Scheme: "ws", Host: *addr, Path: "/echo"}log.Printf("connecting to %s", u.String())c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {log.Fatal("dial:", err)}defer c.Close()done := make(chan struct{})go func() {defer close(done)for {_, message, err := c.ReadMessage()if err != nil {log.Println("read:", err)return}log.Printf("recv: %s", message)}}()ticker := time.NewTicker(time.Second)defer ticker.Stop()for {select {case <-done:returncase t := <-ticker.C:err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))if err != nil {log.Println("write:", err)return}case <-interrupt:log.Println("interrupt")// Cleanly close the connection by sending a close message and then// waiting (with timeout) for the server to close the connection.err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))if err != nil {log.Println("write close:", err)return}select {case <-done:case <-time.After(time.Second):}return}}
}

client output:

connecting to ws://localhost:8080/echo
recv: 2018-10-20 17:09:12.497129965 +0800 CST m=+1.010137585
recv: 2018-10-20 17:09:13.495602484 +0800 CST m=+2.008641088
recv: 2018-10-20 17:09:14.49401062 +0800 CST m=+3.007080206
recv: 2018-10-20 17:09:15.497114615 +0800 CST m=+4.010215329
recv: 2018-10-20 17:09:16.494394706 +0800 CST m=+5.007526368
^Cinterrupt
read: websocket: close 1000 (normal)

web client

web client,也就是使用浏览器。
在浏览器中输入http://127.0.0.1:8080

“Open”,然后"send"

server output:

recv: Hello world!

参考

百度百科

https://baike.baidu.com/item/WebSocket

github

https://github.com/gorilla/websocket

doc

https://godoc.org/github.com/gorilla/websocket

example

https://github.com/gorilla/websocket/blob/master/examples/

golang gorilla websocket例子相关推荐

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

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

  2. gorilla websocket 实例

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

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

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

  4. gorilla websocket简易介绍

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

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

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

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

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

  7. Golang Iris Websocket 跨域问题

    问题描述 在尝试使用iris中的websocket搭建一个实时通讯聊天的demo时,出现一个Upgrade Error错误,一个跨域问题,网上说要修改golang中的websocket upgrade ...

  8. golang代理websocket请求

    基础: golang websocket github地址: GitHub - gorilla/websocket: A fast, well-tested and widely used WebSo ...

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

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

最新文章

  1. 最近火了的自动驾驶全球产业链全景图
  2. 工厂模式-CaffeNet训练
  3. 开源 数据仓库_使用这些开源工具进行数据仓库
  4. 【牛客 - 331B】炫酷五子棋(STLset 或Hash,tricks,二维map标记)
  5. LeetCode 878. 第 N 个神奇数字(二分查找)
  6. java常用的缓存_java 常用缓存 - 只对肉有感觉的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. linux下的yum命令详解
  8. 从另一个视角看待逻辑回归
  9. python-format函数
  10. Abobe Flash cs6 和 Abobe Flash Builder4.6 破解和许可证过期
  11. 百度地图怎么不显示服务器地址,百度地图使用指南
  12. Aop切面自定义注解的使用
  13. visio软件接口流程图_绘制流程图——Visio可以让你事半功倍哦!
  14. spark学习之SparkStreaming
  15. 英语语法最终珍藏版笔记-8虚拟语气
  16. Gentoo Linux+KDE Plasma桌面安装教程
  17. 13.罗马数字转整数
  18. 3.2.1 体渲染之Ray Casting
  19. 数据结构与算法基础——重要知识点截图【青岛大学-王卓版】
  20. PS常见问题03——如何绘制水平、竖直及45°直线

热门文章

  1. python:小鱼的航程
  2. 计算机一级B考试总结500字,期中考试反思作文500字
  3. 单细胞论文记录(part9)--Spatial charting of single-cell transcriptomes in tissues
  4. Matlab Shannon编码
  5. 128Echarts - 关系图(NPM Dependencies)
  6. 粤嵌开发板ARM电子相册
  7. 采埃孚ZF EDI DESADV需求实现
  8. CUDA流多处理器(stream multiprocessor,sm)和硬件流处理器(stream processor,sp)
  9. 比特率 Kbps kbit/s 1KB/s Byte 的正确理解
  10. 12.2 做一个读书的读书人——《逆袭大学》连载