问题内容
谁能帮忙解释一下下面的代码片段的含义吗?
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.doneWebsocket Chat - Golang <script> var input, output, websocket; function showMessage(msg) { var p = document.createElement("p"); p.innerHTML = msg; output.appendChild(p); } function onMessage(e) { showMessage(e.data); } function onClose() { showMessage("Connection closed."); } function onKeyUp(e) { if (e.keyCode === 13) { sendMessage(); } } function sendMessage() { var msg = input.value; input.value = ""; websocket.send(msg + "n"); showMessage(msg); } function init() { input = document.getElementById("input"); input.addEventListener("keyup", onKeyUp, false); output = document.getElementById("output"); websocket = new WebSocket("ws://{{.}}/socket"); websocket.onmessage = onMessage; websocket.onclose = onClose; } window.addEventListener("load", init); </script> 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)
不太明白为什么当第二个加入者加入聊天频道时可以执行这个聊天功能。
正确答案
看起来 HTTP 处理程序创建了一个 Web 套接字并开始等待另一方连接。这是因为当处理HTTP请求时,处理程序调用match
,这将在select
上阻塞,因为partner
通道既不可读也不可写。没有 goroutine 监听它,或者发送给它。
当第二个请求到来时,match
会再次从另一个 goroutine 中调用。现在有两个 goroutine,并且它们可以匹配。其中一个 goroutine 可以发送到 partner
通道,另一个 goroutine 接收它。传输的对象是读写器,然后用于两个伙伴之间的通信。
想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » Golang websocket
本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
如有侵权请发送邮件至1943759704@qq.com删除
码农资源网 » Golang websocket