问题内容
谁能帮忙解释一下下面的代码片段的含义吗?
var partner = make(chan io.ReadWriteCloser)
func match(c io.ReadWriteCloser) {
fmt.Fprintln(c, "Waiting for a partner...")
select {
case partner <- c:
// handled by the other goroutine
case p := <-partner:
chat(p, c)
}
}
完整版:
package main
import (
"fmt"
"golang.org/x/net/websocket"
"html/template"
"io"
"log"
"net/http"
)
const listenAddr = "localhost:4000"
type socket struct {
conn *websocket.Conn
done chan bool
}
func (s socket) Read(b []byte) (int, error) {
return s.conn.Read(b)
}
func (s socket) Write(b []byte) (int, error) {
return s.conn.Write(b)
}
func (s socket) Close() error {
s.done <- true
return nil
}
var rootTemplate = template.Must(template.New("root").Parse(`
Websocket Chat - Golang
Say:
`))
func rootHandler(w http.ResponseWriter, r *http.Request) {
rootTemplate.Execute(w, listenAddr)
}
func socketHandler(conn *websocket.Conn) {
s := socket{conn: conn, done: make(chan bool)}
go match(s)
<-s.done
}
var partner = make(chan io.ReadWriteCloser)
func match(c io.ReadWriteCloser) {
fmt.Fprintln(c, "Waiting for a partner...")
select {
case partner <- c:
// handled by the other goroutine
case p := <-partner:
chat(p, c)
}
}
func chat(a, b io.ReadWriteCloser) {
fmt.Fprintln(a, "Found one! Say hi.")
fmt.Fprintln(b, "Found one! Say hi.")
errc := make(chan error, 1)
go cp(a, b, errc)
go cp(b, a, errc)
if err := <-errc; err != nil {
log.Println(err)
}
a.Close()
b.Close()
go io.Copy(b, a)
io.Copy(a, b)
}
func cp(w io.Writer, r io.Reader, errc chan<- error) {
_, err := io.Copy(w, r)
errc <- err
}
func main() {
http.HandleFunc("/", rootHandler)
http.Handle("/socket", websocket.Handler(socketHandler))
err := http.ListenAndServe(listenAddr, nil)
if err != nil {
log.Fatal(err)
}
}
不太明白为什么当第二个加入者加入聊天频道时可以执行这个聊天功能。
正确答案
看起来 HTTP 处理程序创建了一个 Web 套接字并开始等待另一方连接。这是因为当处理HTTP请求时,处理程序调用match
,这将在select
上阻塞,因为partner
通道既不可读也不可写。没有 goroutine 监听它,或者发送给它。
当第二个请求到来时,match
会再次从另一个 goroutine 中调用。现在有两个 goroutine,并且它们可以匹配。其中一个 goroutine 可以发送到 partner
通道,另一个 goroutine 接收它。传输的对象是读写器,然后用于两个伙伴之间的通信。
以上就是Golang websocket的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- 如何高效使用Uncomtrade数据库进行查询
- Java 配置环境变量后如何进行使用操作?(java配置环境变量后如何使用)
- Java 中防止接口重复提交的方法有哪些?(java接口防止重复提交的方法是什么)
- 如何提高 Java Office 的性能?(java office 怎样提高性能 )
- Java 抽象工厂模式的优缺点有哪些?(java抽象工厂模式有哪些优缺点)
- 在 Java 中,charsequence 的具体用法究竟是什么?(java中charsequence的用法是什么)
- 如何利用 Java Quarter 进行数据挖掘?(java quarter如何进行数据挖掘)
- Java 中常见的比较操作符有哪些?(Java比较操作符有哪些)
- 在 Java 中,Integer 究竟有哪些作用呢?(java中integer的作用是什么)
- Java 实体类如何进行赋值操作?(java实体类怎么赋值)
猜你喜欢
AI推送时光机Golang websocket
后端开发2024-02-05golang搭建websocket
后端开发2023-05-22golang实现websocket
后端开发2023-05-22golang websocket框架怎么用
后端开发2023-10-27golang websocket聊天室怎么实现
后端开发2024-02-29golang中vue使用websocket的示例分析
后端开发2023-06-15如何使用golang创建WebSocket服务器
后端开发2023-12-17golang基于websocket通信tcpkeepalive研究记录
后端开发2024-04-02golang基于websocket通信tcp keepalive实例分析
后端开发2023-06-30golang WebSocket框架推荐:简化开发流程
后端开发2023-12-17golang WebSocket教程:如何实现实时通信
后端开发2023-12-17golang WebSocket编程技巧:处理并发连接
后端开发2023-12-18Golang函数的tcp、udp、http和websocket处理方法
后端开发2023-05-20如何在golang中使用Websocket来转发数据
后端开发2023-05-14如何在golang中实现WebSocket的双向通信
后端开发2023-12-18golang Websocket教程:如何开发在线投稿功能
后端开发2023-12-17如何在golang中使用WebSocket进行远程控制
后端开发2023-12-17golang WebSocket调试技巧:快速解决通信问题
后端开发2023-12-18 咦!没有更多了?去看看其它编程学习网 内容吧