返回顶部
首页 > 资讯 > 后端开发 > GO >Golang websocket
  • 672
分享到

Golang websocket

2024-02-05 21:02:00 672人浏览 泡泡鱼
摘要

问题内容 谁能帮忙解释一下下面的代码片段的含义吗? var partner = make(chan io.ReadWriteCloser) func match(c io.ReadW

问题内容

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

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的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang websocket

本文链接: https://lsjlt.com/news/561059.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang websocket
    问题内容 谁能帮忙解释一下下面的代码片段的含义吗? var partner = make(chan io.ReadWriteCloser) func match(c io.ReadW...
    99+
    2024-02-05
  • golang实现websocket
    随着互联网技术的不断发展,实时连接成为了越来越多应用的必备功能。WebSocket 是一种基于 TCP 协议的网络协议,它允许服务器向客户端推送数据,实现实时双向通信。Go 是一门快速高效的编程语言,由于其简洁、高效等特点,成为了近年来非常...
    99+
    2023-05-22
  • golang搭建websocket
    Golang是一种快速编译、高效、安全的编程语言,在Web开发方面也有着广泛的应用。其中,使用Golang搭建Websocket是一个非常流行的应用场景。本文将介绍如何使用Golang搭建一个Websocket应用程序。一、什么是Webso...
    99+
    2023-05-22
  • golang websocket框架怎么用
    使用Golang编写WebSocket应用程序可以使用一些流行的框架,例如Gorilla WebSocket或Melody。下面是使...
    99+
    2023-10-27
    golang
  • golang websocket聊天室怎么实现
    要实现一个golang的websocket聊天室,可以遵循以下步骤: 导入所需的包: import ( "fm...
    99+
    2024-02-29
    golang websocket
  • 带 cookie 身份验证的 Golang Websocket (Gorilla)
    在Web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。Golang作为一种高效、简洁的编程语言,拥有强大的Web开发能力。本文将介绍如何使用Gor...
    99+
    2024-02-11
  • golang基于websocket通信tcpkeepalive研究记录
    目录为什么有tcp Keepalive?tcp Keepalive是否默认开启?如何设置tcp keepalive在Linux内核设置golang websocket 客户端默认怎么...
    99+
    2024-04-02
  • golang中vue使用websocket的示例分析
    小编给大家分享一下golang中vue使用websocket的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一. 编写golang服务端导入必要的webs...
    99+
    2023-06-15
  • 如何使用golang创建WebSocket服务器
    如何使用golang创建WebSocket服务器WebSocket是一种在客户端和服务器之间实现双向通信的协议。它允许我们通过一个持久的连接在客户端和服务器之间传输数据。在这篇文章中,我将向你介绍如何使用golang创建一个简单的WebSo...
    99+
    2023-12-17
    websocket Golang (Go) 服务器 (Server)
  • golang基于websocket通信tcp keepalive实例分析
    本文小编为大家详细介绍“golang基于websocket通信tcp keepalive实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang基于websocket通信tcp keepalive实例分析”文...
    99+
    2023-06-30
  • golang WebSocket编程技巧:处理并发连接
    Golang是一种功能强大的编程语言,它在WebSocket编程中的使用越来越受到开发者的重视。WebSocket是一种基于TCP的协议,它允许在客户端和服务器之间进行双向通信。在本文中,我们将介绍如何使用Golang编写高效的WebSoc...
    99+
    2023-12-18
    Golang websocket 并发连接
  • golang WebSocket框架推荐:简化开发流程
    Golang WebSocket框架推荐:简化开发流程,需要具体代码示例在现代的网络应用程序开发中,实时通信已经成为了一个非常重要的功能需求。WebSocket作为一种全双工通信协议,既可以在客户端和服务端之间实现实时双向通信,也可以与现有...
    99+
    2023-12-17
    Golang websocket 简化开发流程
  • golang WebSocket教程:如何实现实时通信
    Golang WebSocket教程:如何实现实时通信首先,让我们来介绍一下什么是WebSocket。WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议。与HTTP协议不同,WebSocket允许服务器向客户端推送数据,...
    99+
    2023-12-17
    golang WebSocket教程:实时通信
  • 如何在golang中使用Websocket来转发数据
    近年来,随着互联网技术的飞速发展,Websocket技术日益受到人们的关注和重视。Websocket是一种基于TCP协议的全双工通信协议,在Web应用程序和服务器之间实现了双向通信。使用Websocket技术,可以建立关键的实时连接,同时减...
    99+
    2023-05-14
  • Golang函数的tcp、udp、http和websocket处理方法
    随着互联网技术的不断发展,网络通信已经成为了现代化的必备技能。在这个过程中,函数(Function)作为一种高效、灵活的编程方法,也成为了越来越多程序员所青睐的工具。而在这些函数中,基于TCP、UDP、HTTP和WebSocket协议的处理...
    99+
    2023-05-20
    Golang TCP/UDP HTTP/WebSocket
  • 如何在golang中实现WebSocket的双向通信
    如何在 Golang 中实现 WebSocket 的双向通信WebSockets 是一种在客户端和服务器之间建立持久化连接的通信协议,它允许双向通信,而且在实时性和效率方面表现出色。在 Golang 中,我们可以使用标准库中的 net/ht...
    99+
    2023-12-18
    Golang websocket 双向通信
  • WebSocket
    目录 一,什么是websocket 二,websocket的原理 三,websocket与http的关系 四,websocket解决的问题 1.http存在的问题 2.long poll(长轮询) 3.Ajax轮询 4.websocket的...
    99+
    2023-09-03
    web java
  • golang实现一个简单的websocket聊天室功能
    基本原理: 1.引入了 golang.org/x/net/websocket 包。 2.监听端口。 3.客户端连接时,发送结构体: {"type":"login","uid":"我是...
    99+
    2024-04-02
  • 如何在golang中使用WebSocket进行文件传输
    如何在golang中使用WebSocket进行文件传输WebSocket是一种支持双向通信的网络协议,能够在浏览器和服务器之间建立持久的连接。在golang中,我们可以使用第三方库gorilla/websocket来实现WebSocket功...
    99+
    2023-12-18
    Golang websocket 文件传输
  • 如何在golang中使用WebSocket进行远程控制
    如何在Go语言中使用WebSocket进行远程控制简介:WebSocket是一种在Web应用程序中实现实时双向通信的技术。在Go语言中,我们可以使用标准库中的net/http和github.com/gorilla/websocket包来实现...
    99+
    2023-12-17
    Golang websocket 远程控制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作