如何使用大猩猩连接到 websocket?
How to connect to a websocket using gorilla?
我想看一个关于如何使用大猩猩连接到 websocket 的最小和简单的示例。
我发现连接到 websocket 的唯一示例是 this,
但我无法理解它,也找不到它是如何工作的解释。
编辑:
第 20 行:
为什么他将 websocket 地址保留在 flag.String
而不是可变字符串中?
第 26 行:
这部分是否创建一个信号,当用户按下 crtl + C 时通知程序?
interrupt: = make(chan os.Signal, 1)
signal.Notify (interrupt, os.Interrupt)
第 32 行:
这条线是做什么的?
websocket.DefaultDialer.Dial (u.String (), nil)
第 60 行:
因为 []byte(t.String())
而不是 t.string()
?
样本的 README
说:
The client sends a message every second and prints all messages received.
查看代码,后半部分(打印收到的所有消息)发生在这里:
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("recv: %s", message)
}
}()
这会启动一个 goroutine,循环读取来自 c
(websocket 连接)的消息并将它们打印出来。它会在读取失败时停止,这种情况发生在错误和连接关闭时。
主 goroutine 这样做:
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
}
}
它每秒都会触发一个自动收报机,消息会发送到 websocket。当 reader goroutine 完成后,它会关闭 done
通道,这也会用 select
发出这个循环退出的信号。
最后,有一个“中断”选择来处理 Ctrl+C,干净地停止客户端。
回答您的具体问题:
第 20 行:此标志使您能够在执行程序时从命令行设置地址,而不是对其进行硬编码。例如,您可以像 client -addr localhost:9044
一样调用它来设置不同的端口。另见 https://gobyexample.com/command-line-flags
第 26 行:是的,这是给 Ctrl+C
的;另见 https://gobyexample.com/signals
第 32 行:DefaultDialer
是 websocket
包中的 preconfigured 拨号器。根据文档,它等同于
var DefaultDialer = &Dialer{
Proxy: http.ProxyFromEnvironment,
HandshakeTimeout: 45 * time.Second,
}
第 60 行:WriteMessage 采用 []byte
,因此您必须将字符串转换为 []byte
我想看一个关于如何使用大猩猩连接到 websocket 的最小和简单的示例。
我发现连接到 websocket 的唯一示例是 this, 但我无法理解它,也找不到它是如何工作的解释。
编辑:
第 20 行:
为什么他将 websocket 地址保留在 flag.String
而不是可变字符串中?
第 26 行:
这部分是否创建一个信号,当用户按下 crtl + C 时通知程序?
interrupt: = make(chan os.Signal, 1)
signal.Notify (interrupt, os.Interrupt)
第 32 行:
这条线是做什么的?
websocket.DefaultDialer.Dial (u.String (), nil)
第 60 行:
因为 []byte(t.String())
而不是 t.string()
?
样本的 README
说:
The client sends a message every second and prints all messages received.
查看代码,后半部分(打印收到的所有消息)发生在这里:
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("recv: %s", message)
}
}()
这会启动一个 goroutine,循环读取来自 c
(websocket 连接)的消息并将它们打印出来。它会在读取失败时停止,这种情况发生在错误和连接关闭时。
主 goroutine 这样做:
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
}
}
它每秒都会触发一个自动收报机,消息会发送到 websocket。当 reader goroutine 完成后,它会关闭 done
通道,这也会用 select
发出这个循环退出的信号。
最后,有一个“中断”选择来处理 Ctrl+C,干净地停止客户端。
回答您的具体问题:
第 20 行:此标志使您能够在执行程序时从命令行设置地址,而不是对其进行硬编码。例如,您可以像 client -addr localhost:9044
一样调用它来设置不同的端口。另见 https://gobyexample.com/command-line-flags
第 26 行:是的,这是给 Ctrl+C
的;另见 https://gobyexample.com/signals
第 32 行:DefaultDialer
是 websocket
包中的 preconfigured 拨号器。根据文档,它等同于
var DefaultDialer = &Dialer{
Proxy: http.ProxyFromEnvironment,
HandshakeTimeout: 45 * time.Second,
}
第 60 行:WriteMessage 采用 []byte
,因此您必须将字符串转换为 []byte