最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Golang websocket

    golang websocket

    问题内容

    谁能帮忙解释一下下面的代码片段的含义吗?

    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 
    
        
            Websocket 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
    • 7会员总数(位)
    • 25846资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 293稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情