来源:未知 时间:2022-04-07 14:11 作者:小飞侠 阅读:次
[导读] 前言: golang官网没有websocket库,所以一般都基于三方库,目前好用的有 gorilla/websocket 库,可以通过此链接 https://pkg.go.dev/github.com/gorilla/websocket@v1.5.0 查看具体用法,本教程就提供一个简...
前言:golang官网没有websocket库,所以一般都基于三方库,目前好用的有 gorilla/websocket 库,可以通过此链接 https://pkg.go.dev/github.com/gorilla/websocket@v1.5.0 查看具体用法,本教程就提供一个简单的实列告诉大家用法。 特别要注意下,websocket其实也是基于http协议的升级,所以gorilla/websockt 作者特此用 利于此方法升级链接协议,如下: var upgrader = websocket.Upgrader{} // use default options Upgrader更多参数请查看:type Upgrader struct { //握手超时指定握手完成的持续时间。 HandshakeTimeout time.Duration //ReadBufferSize和WriteBufferSize以字节为单位指定I/O缓冲区大小。如果缓冲区 //大小为零,则使用HTTP服务器分配的缓冲区。这个 //I/O缓冲区大小不限制可以发送的消息的大小 //或收到。 ReadBufferSize, WriteBufferSize int //WriteBufferPool是用于写操作的缓冲池。如果价值 //则会将写缓冲区分配给 //连接的生命周期。 // //当应用程序的写入量适中时,池最有用 //跨越大量连接。 // //应用程序应为每个唯一的 //WriteBufferSize。 WriteBufferPool BufferPool //Subtocols按顺序指定服务器支持的协议 //偏好。如果此字段不是nil,则升级方法协商 //通过选择此列表中与协议匹配的第一项来执行子策略 //客户要求的。如果没有匹配,就没有协议 //协商(Sec Websocket协议头不包括在 //握手反应)。 Subprotocols []string //Error指定用于生成HTTP错误响应的函数。如果出错 //是nil,然后是http。错误用于生成HTTP响应。 Error func(w http.ResponseWriter, r *http.Request, status int, reason error) //如果请求来源标头可接受,则CheckOrigin返回true。如果 //CheckOrigin为nil,则使用安全默认值:如果 //源请求标头存在,且源主机不等于 //请求主机头。 // //CheckOrigin函数应该仔细验证请求来源 //防止跨站点请求伪造。 CheckOrigin func(r *http.Request) bool //EnableCompression指定服务器是否应尝试根据进行协商 //消息压缩(RFC 7692)。将此值设置为true不会 //保证压缩将得到支持。目前只有“无上下文” //支持“接管”模式。 EnableCompression bool } 具体代码如下:同学可以复制到项目中直接运行,不过新手要注意用 go get github.com/gorilla/websocket 下载相关依赖,如果是新版本go 有 mod的可以直接运行。 // 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 ignore package main import ( "flag" "fmt" "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 options // 全局容器 var allClient map[int]*websocket.Conn = make(map[int]*websocket.Conn) // *websocket.Conn var clientKey int = 0 // 广播 func broadcast(msg []byte) { for i, citem := range allClient { fmt.Println(i) msgs := "某" + string(i) + ":" + string(msg) citem.WriteMessage(1, []byte(msgs)) } } func echo(w http.ResponseWriter, r *http.Request) { clientKey = clientKey + 1 c, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("upgrade:", err) return } // 加入map allClient[clientKey] = c defer c.Close() fmt.Printf("%+v", allClient) for { mt, message, err := c.ReadMessage() // fmt.Println("test link", mt) 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 } // 广播消息 broadcast(message) } } 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> `)) 延伸阅读有利于通道更完善的实列:https://blog.csdn.net/hhyihquk1/article/details/104388243 以上就是Golang基于gorilla/websocket库实现websocket实列全部内容,感谢大家支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com