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方法的第三个参数怎么用的?