go使用WebSocket协议建立长连接
1.WebSocket协议
主要是为了记录和使用webSocket协议,所以webSocket的详细运行过程没有太多介绍
概念
HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握手通道。
如何建立连接
- 客户端先申请协议升级:首先,客户端采用标准的HTTP报文格式申请协议升级,且只支持GET方法。
- 服务端响应协议升级
2.Go使用websocket协议
1.导包
import (
//这个是websocket的包
"github.com/gorilla/websocket"
//本次测试用到的其他包
"log"
"net/http"
"html/template"
)
2.建立http服务
上面已经介绍,websocket是采用标准的http协议升级而来,所以可以先建立hppt服务
http.HandleFunc("/echo", echo)
http.ListenAndServe(":8080", nil)
其中echo函数为func(ResponseWriter, *Request)
类型
3.申请协议升级
1.客户端向服务端申请升级为websocket协议
//html内容中的js部分,ws = new WebSocket("{{.}}")是客户端向服务端
//提出websocket协议请求
var homeTemplate = template.Must(template.New("").Parse(`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<table>
<tr><td valign="top" width="50%">
</td><td valign="top" width="50%">
<div id="output"></div>
</td></tr>
</table>
<script>
window.addEventListener("load", function(evt) {
var output = document.getElementById("output");
var ws;
var print = function(message) {
var d = document.createElement("div");
d.textContent = message;
output.appendChild(d);
output.scroll(0, output.scrollHeight);
};
ws = new WebSocket("{{.}}")
ws.onmessage = function(evt) {
print(evt.data);
}
ws.onerror = function(evt) {
print("ERROR: " evt.data);
}
});
</script>
</body>
</html>
`))
2.服务端接受请求
func echo(w http.ResponseWriter, r *http.Request) {
//先升级http协议,此处nil可以填写其他内容,本次只是为了简单应用websocket
//nil可以填cookie和其他实现内容
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("upgrade:", err)
return
}
defer c.Close()
count := 0
for {
if count = 1; count > 100{
break
}
//建立信息
message := []byte("1111")
//log.Printf("recv: %s", message)
//此处1指代后面的内容为字符串 发送信息给客户端
err = c.WriteMessage(1, message)
if err != nil {
log.Println("write:", err)
break
}
}
}
3.将数据展示到浏览器上
func home(w http.ResponseWriter, r *http.Request) {
//这里"ws://" r.Host "/echo"内容需要被用到上面客户端与服务端建立连接,
//当然也可以直接写道里面去
homeTemplate.Execute(w, "ws://" r.Host "/echo")
}
4.最终服务展示
http.HandleFunc("/echo", echo)
http.HandleFunc("/", home)
log.Fatal(http.ListenAndServe(":8080", nil))
3.结语
本次测试只是为简单记录下go语言使用websocket的过程,但不仅限于此。
本次测试最终是为了提供一个API接口-----实时展示日志文件
当然,websocket协议应用场景非常广泛,像实时解析视频数据----与解码服务端建立websocket协议连接,这样每一帧视频发送过来可以直接解码,而不需要重新进行连接
4.参考文献
1.WebSocket从入门到精通,半小时就够!
2.WebSocket 是什么原理?为什么可以实现持久连接?
3.gorilla/websocket官方echo例子
4.golang简单实现Websocket
5.有个网络库叫gorilla, gorilla有个包叫websocket, websocket包有个方法叫upgrade, 这个upgrade方法的第三个参数怎么用的?
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbfgaf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01