登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> SoftHub关联区 >> 主题: golang 目前的两种 websocket 实现     [回主站]     [分站链接]
golang 目前的两种 websocket 实现
clq
浏览(243) - 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







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


总数:2 页次:1/1 首页 尾页  
总数:2 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1