Golang websocket
短信预约 -IT技能 免费直播动态提醒
问题内容
谁能帮忙解释一下下面的代码片段的含义吗?
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
Golang websocket
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
Golang websocket
问题内容谁能帮忙解释一下下面的代码片段的含义吗?var partner = make(chan io.ReadWriteCloser)func match(c io.ReadWriteCloser) {fmt.Fprintln(c, "
2024-02-05
2023-05-22
2023-05-22
golang websocket框架怎么用
使用Golang编写WebSocket应用程序可以使用一些流行的框架,例如Gorilla WebSocket或Melody。下面是使用Gorilla WebSocket框架的简单示例:首先,确保你已经安装了Golang,并且已经设置好了工作
2023-10-27
golang websocket聊天室怎么实现
要实现一个golang的websocket聊天室,可以遵循以下步骤:导入所需的包:import ("fmt""log""net/http""github.com/gorilla/websocket")定义一个websocket连接的upg
2024-02-29
带 cookie 身份验证的 Golang Websocket (Gorilla)
在Web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。Golang作为一种高效、简洁的编程语言,拥有强大的Web开发能力。本文将介绍如何使用Gorilla工具包在Golang中实现带cookie身份验证
2024-02-11
golang中vue使用websocket的示例分析
小编给大家分享一下golang中vue使用websocket的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一. 编写golang服务端1.导入必要的we
2023-06-15
如何使用golang创建WebSocket服务器
如何使用golang创建WebSocket服务器WebSocket是一种在客户端和服务器之间实现双向通信的协议。它允许我们通过一个持久的连接在客户端和服务器之间传输数据。在这篇文章中,我将向你介绍如何使用golang创建一个简单的WebSo
2023-12-17
2024-04-02
golang基于websocket通信tcp keepalive实例分析
本文小编为大家详细介绍“golang基于websocket通信tcp keepalive实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang基于websocket通信tcp keepalive实例分析”文章能帮助大家解决疑惑
2023-06-30
golang WebSocket框架推荐:简化开发流程
Golang WebSocket框架推荐:简化开发流程,需要具体代码示例在现代的网络应用程序开发中,实时通信已经成为了一个非常重要的功能需求。WebSocket作为一种全双工通信协议,既可以在客户端和服务端之间实现实时双向通信,也可以与现有
2023-12-17
golang WebSocket教程:如何实现实时通信
Golang WebSocket教程:如何实现实时通信首先,让我们来介绍一下什么是WebSocket。WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议。与HTTP协议不同,WebSocket允许服务器向客户端推送数据,
2023-12-17
golang WebSocket编程技巧:处理并发连接
Golang是一种功能强大的编程语言,它在WebSocket编程中的使用越来越受到开发者的重视。WebSocket是一种基于TCP的协议,它允许在客户端和服务器之间进行双向通信。在本文中,我们将介绍如何使用Golang编写高效的WebSoc
2023-12-18
2023-05-20
2023-05-14
如何在golang中实现WebSocket的双向通信
如何在 Golang 中实现 WebSocket 的双向通信WebSockets 是一种在客户端和服务器之间建立持久化连接的通信协议,它允许双向通信,而且在实时性和效率方面表现出色。在 Golang 中,我们可以使用标准库中的 net/ht
2023-12-18
golang Websocket教程:如何开发在线投稿功能
Golang Websocket教程:如何开发在线投稿功能引言:随着互联网的飞速发展,越来越多的应用程序需要实现实时通信功能。在网络应用中,Websocket技术已经成为一种常用的通信协议。本文旨在教会读者如何使用Golang语言开发一个在
2023-12-17
如何在golang中使用WebSocket进行远程控制
如何在Go语言中使用WebSocket进行远程控制简介:WebSocket是一种在Web应用程序中实现实时双向通信的技术。在Go语言中,我们可以使用标准库中的net/http和github.com/gorilla/websocket包来实现
2023-12-17
golang WebSocket调试技巧:快速解决通信问题
在开发golang WebSocket应用程序时,常常会遇到各种通信问题,如连接无法建立,消息传输失败等等。这些问题可能会卡住应用程序的进程,使其无法正常工作。因此,在调试时,我们需要掌握一些技巧,以便快速解决通信问题。下面我们将介绍一些有
2023-12-18
2023-09-03
编程热搜
Python 学习之路 - Python
一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-chatgpt的中文全称是什么
chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列C/C++可变参数的使用
可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃Python 3 教程
Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 PythonPython pip包管理
一、前言 在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install 和 pip , 目前官方推荐使用 pip。
编程资源站
- 资料下载
- 历年试题