1 回答
TA贡献1951条经验 获得超3个赞
该示例说:README
客户端每秒发送一条消息,并打印收到的所有消息。
查看代码,后一部分(打印收到的所有消息)发生在这里:
go func() {
defer close(done)
for {
_, message, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("recv: %s", message)
}
}()
这将启动一个 goroutine,该 goroutine 在循环中读取来自(websocket 连接)的消息并将其打印出来。当读取失败时,它会停止,这会发生错误和连接关闭。c
主 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。当读取器完成时,它关闭通道,该通道也发出此循环的信号,并退出。doneselect
最后,有一个“中断”选择来处理Ctrl+C,干净利落地停止客户端。
要回答您的具体问题:
第 20 行:此标志使您能够在执行程序时从命令行设置地址,而不是对其进行硬编码。例如,您可以称它为设置其他端口。另请参见 https://gobyexample.com/command-line-flagsclient -addr localhost:9044
第26行:是的,这是为了;另请参见 https://gobyexample.com/signalsCtrl+C
第 32 行:是程序包中预配置的拨号程序。根据文档,它相当于DefaultDialerwebsocket
var DefaultDialer = &Dialer{
Proxy: http.ProxyFromEnvironment,
HandshakeTimeout: 45 * time.Second,
}
第 60 行:WriteMessage 采用 一个 ,因此您必须将字符串转换为[]byte[]byte
- 1 回答
- 0 关注
- 125 浏览
添加回答
举报
