golang 目前的两种 websocket 实现
clq
浏览(445) -
2020-11-18 14:05:05 发表
编辑
关键字:
[2020-11-18 14:06:53 最后更新]
golang 目前的两种 websocket 实现 据说建议将golang.org/x/net/websocket替换为github.com/gorilla/websocket。 ---------------------------------------------------------------- https://studygolang.com/articles/14842 golang.org/x/net/websocket 官网websocket支持长链修改。支持聊天室。 bobohume · 2018-09-14 20:04:01 · 3387 次点击 · 预计阅读时间不到 1 分钟 · 大约3小时之前 开始浏览 这是一个创建于 2018-09-14 20:04:01 的文章,其中的信息可能已经有所发展或是发生改变。 golang 官方websocket,不支持长链模式,关键在server这里,defer close了读写io,在hander返回之后,就close掉了。小伙伴门,可以注释掉这一样,但是在webconn这里,记得回调会close。不然这个读写io没close。 111.png2222.png333.png 有疑问加站长微信联系(非本文作者)) 入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:1006366459 3387 次点击 加入收藏 微博 赞 收入我的专栏 上一篇:Golang Excel导入数据并标注此行背景色和异常数据提示暂时 下一篇:Golang的slice为何一定要len和cap二者 net 链 修改 支持 2 回复 | 直到 2019-07-12 17:49:14 bobohume bobohume · #1 · 大约1年之前 image.png 修改websocket 默认TextFrame改成 BinaryFrame bobohume bobohume · #2 · 大约1年之前 image.png 修改websocket 默认TextFrame改成 BinaryFrame
clq
2020-11-18 14:06:04 发表
编辑
https://www.cnblogs.com/lanyangsh/p/9190296.html Golang如何使用websocket Posted on 2018-06-16 12:25 翔云123456 阅读(13427) 评论(3) 编辑 收藏 下载websocket包 $ go get golang.org/x/net/websocket 如果下载失败,可能是被墙了。 package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket" (https fetch: Get https://golang.org/x/net/websocket?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.) 可以尝试 $ go get -u github.com/golang/net/websocket 下载后记得将路径改成golang.org/x/net/websocket $ cd $GOPATH $ mkdir -p golang.org/x/net $ cp github.com/golang/net/websocket/ golang.org/x/net/ -R 实例 服务端代码 server.go package main import ( "fmt" "golang.org/x/net/websocket" "html/template" //支持模板html "log" "net/http" ) func Echo(ws *websocket.Conn) { var err error for { var reply string //websocket接受信息 if err = websocket.Message.Receive(ws, &reply); err != nil { fmt.Println("receive failed:", err) break } fmt.Println("reveived from client: " + reply) msg := "received:" + reply fmt.Println("send to client:" + msg) //这里是发送消息 if err = websocket.Message.Send(ws, msg); err != nil { fmt.Println("send failed:", err) break } } } func web(w http.ResponseWriter, r *http.Request) { //打印请求的方法 fmt.Println("method", r.Method) if r.Method == "GET" { //如果请求方法为get显示login.html,并相应给前端 t, _ := template.ParseFiles("websocket.html") t.Execute(w, nil) } else { //否则走打印输出post接受的参数username和password fmt.Println(r.PostFormValue("username")) fmt.Println(r.PostFormValue("password")) } } func main() { //接受websocket的路由地址 http.Handle("/websocket", websocket.Handler(Echo)) //html页面 http.HandleFunc("/web", web) if err := http.ListenAndServe(":1234", nil); err != nil { log.Fatal("ListenAndServe:", err) } } 客户端代码 websocket.html go测试socket WebSocket Echo Test Send Message 测试 启动服务端 $ ./server 启动浏览器 输入http://127.0.0.1:1234/web 这里写图片描述 网络通信内容如图所示,首先加载页面,接着使用HTTP建立websocket连接,后续通信直接使用websocket进行。 点击 页面中SendMessage按钮 server端输出: method GET reveived from client: Hello, world! send to client:received:Hello, world! 浏览器输出: 这里写图片描述 参考 https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/08.2.md https://github.com/ukai/go-websocket-sample/blob/master/websocket_echo_sample.go Just try, don't shy.
clq
2020-11-18 14:06:53 发表
编辑
https://www.cnblogs.com/dfsxh/p/11995864.html golang gorilla websocket例子 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 ignore package main import ( "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 options func 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(`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.
`)) 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 ignore package main import ( "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: return case 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/ 分类: GO
本帖子属于以下条目()
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.