GolangWebSocket客户端与服务器示例

答案:使用Golang和gorilla/websocket库可实现WebSocket通信。1. 安装依赖:go get github.com/gorilla/websocket;2. 编写服务器端代码,监听/ws路径,升级HTTP连接为WebSocket,接收并回显消息;3. 编写客户端代码,连接本地服务器,发送”Hello, WebSocket!”并接收回显;4. 先运行服务器,再运行客户端,验证双向通信成功。

golangwebsocket客户端与服务器示例

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,非常适合实时应用,比如聊天、通知推送等。Golang 提供了简洁高效的语言特性来实现 WebSocket 服务端和客户端。下面是一个基于 gorilla/websocket 库的完整示例,展示如何用 Go 编写 WebSocket 服务器与客户端。

1. 安装依赖

使用 gorilla/websocket 库,先安装:

go get github.com/gorilla/websocket

2. WebSocket 服务器端实现

服务器监听 WebSocket 连接,接收客户端消息并回显。

server.go

package mainimport (    "log"    "net/http"    "github.com/gorilla/websocket")var upgrader = websocket.Upgrader{    CheckOrigin: func(r *http.Request) bool {        return true // 允许跨域    },}func echoHandler(w http.ResponseWriter, r *http.Request) {    conn, err := upgrader.Upgrade(w, r, nil)    if err != nil {        log.Print("升级 WebSocket 失败:", err)        return    }    defer conn.Close()    for {        // 读取消息        messageType, message, err := conn.ReadMessage()        if err != nil {            log.Print("读取消息失败:", err)            break        }        log.Printf("收到消息: %s", message)        // 回显消息        if err := conn.WriteMessage(messageType, message); err != nil {            log.Print("发送消息失败:", err)            break        }    }}func main() {    http.HandleFunc("/ws", echoHandler)    log.Println("服务器启动在 :8080")    log.Fatal(http.ListenAndServe(":8080", nil))}

3. WebSocket 客户端实现

客户端连接服务器,发送一条消息并接收回显。

client.go

立即学习“go语言免费学习笔记(深入)”;

package mainimport (    "log"    "net/url"    "github.com/gorilla/websocket")func main() {    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}    log.Printf("连接到 %s", u.String())    conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)    if err != nil {        log.Fatal("连接失败:", err)    }    defer conn.Close()    // 发送消息    message := []byte("Hello, WebSocket!")    err = conn.WriteMessage(websocket.TextMessage, message)    if err != nil {        log.Fatal("发送消息失败:", err)    }    // 读取回显    _, msg, err := conn.ReadMessage()    if err != nil {        log.Fatal("读取消息失败:", err)    }    log.Printf("收到回显: %s", msg)}

4. 运行步骤

启动服务器和客户端验证通信。运行服务器:go run server.go 另起终端运行客户端:go run client.go 服务器应输出收到的消息,客户端输出回显内容

基本上就这些。这个例子展示了最基础的 WebSocket 双向通信流程。你可以在此基础上扩展:广播消息、维护连接池、心跳检测等。不复杂但容易忽略。

以上就是GolangWebSocket客户端与服务器示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1403124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 19:18:43
下一篇 2025年12月15日 19:18:54

相关推荐

  • Golang缓存设计提升程序运行效率

    Golang中常见缓存策略包括LRU、LFU和FIFO,分别适用于不同场景。LRU(最近最少使用)利用container/list与map实现,适合访问具有时间局部性的数据,如会话信息;LFU(最不常用)基于访问频率淘汰数据,适用于访问稳定但不规律的静态资源,但需处理频率老化问题;FIFO(先进先出…

    好文分享 2025年12月15日
    000
  • Golang Linux系统下源码编译安装步骤

    答案是:从源码编译安装Golang需先获取源码并配置构建环境,再通过引导Go版本编译生成二进制文件,最后设置GOROOT、GOPATH和PATH环境变量以完成配置。 在Linux系统下从源码编译安装Golang,核心步骤无非是获取Go的源代码,然后通过系统自带的编译工具链将其构建成可执行文件,并最终…

    2025年12月15日
    000
  • Golang的值类型和指针类型在内存分配(栈与堆)上有何不同

    内存分配由逃逸分析决定,值类型通常栈分配,指针指向对象可能堆或栈分配,关键看是否逃逸。编译器根据变量生命周期优化,非类型本身决定位置。 Go语言中值类型和指针类型在内存分配上的差异,并不在于它们是值还是指针本身,而在于变量的生命周期和逃逸分析结果。Go编译器通过逃逸分析决定一个变量分配在栈上还是堆上…

    2025年12月15日
    000
  • Golang反射与泛型类型结合使用方法

    答案是泛型结合反射可实现类型安全且灵活的通用逻辑。通过PrintFields函数示例,使用reflect.ValueOf和TypeOf获取结构体字段信息,若输入为指针则解引用,遍历字段并打印名称与值,从而在编译期保证类型正确的同时,运行时动态操作结构体成员。 在 Go 语言中,反射(reflect)…

    2025年12月15日
    000
  • Go语言中通过反射正确获取函数名称的实践指南

    1. 理解问题:为什么reflect.TypeOf().Name()不奏效? 在go语言的反射机制中,reflect.typeof函数用于获取任何值的动态类型。当我们将一个函数(例如main函数)传递给reflect.typeof时,它返回的是该函数的类型,而不是一个可以获取其名称的具名类型。对于函…

    2025年12月15日
    000
  • Go语言中处理大整数:超越int64限制的方法

    本文将深入探讨Go语言中处理超出标准整数类型(如int64)范围的超大整数值。我们将分析strconv.ParseInt等函数在面对50位甚至更长数字字符串时的局限性,并详细介绍如何利用math/big包实现任意精度整数的解析、存储与计算,提供清晰的代码示例和使用指导,确保在Go应用中有效管理和操作…

    2025年12月15日
    000
  • Go text/template 中列表元素分隔符的优雅处理:避免末尾逗号

    本文详细阐述了在 Go 语言的 text/template 系统中,如何优雅地处理 range 循环生成的列表元素分隔符问题,特别是避免末尾出现多余的逗号。通过利用 range 动作的索引变量以及模板 if 语句对零值的特殊判断能力,我们可以实现精确的条件渲染,确保输出格式的正确性。 挑战:Go 模…

    2025年12月15日
    000
  • Go语言:使用runtime包获取函数名称的正确方法

    在Go语言中,直接通过reflect.TypeOf(function).Name()获取函数名称会得到空字符串,这是一个常见的误解。本文将详细介绍如何利用reflect.ValueOf(function).Pointer()获取函数的内存地址,并结合runtime.FuncForPC函数,正确地获取…

    2025年12月15日
    000
  • Go语言中处理大整数:超越strconv限制,拥抱math/big包

    在Go语言中,当需要处理超出标准int64范围(如50位数字)的超大整数时,strconv包会因值溢出而失败。本文将详细介绍如何利用Go标准库中的math/big包来精确地解析、存储和操作任意精度的整数,从而有效解决这一问题,并提供实用的代码示例。 超出strconv限制的问题 go语言标准库中的s…

    2025年12月15日
    000
  • Go语言中处理超大整数:突破strconv限制使用math/big包

    本文旨在解决Go语言中strconv包在处理超出标准整型范围(如int64)的超大数字字符串时遇到的“值超出范围”问题。我们将深入探讨strconv的局限性,并详细介绍如何利用Go标准库中的math/big包实现任意精度整数的解析与操作,从而轻松处理任意长度的数字字符串。 strconv包的局限性 …

    2025年12月15日
    000
  • Golang使用Viper配置文件管理实践

    Viper在Golang项目中被广泛使用,因其支持多配置源、类型安全访问和实时更新。首先引入Viper库,设置配置文件名、类型和搜索路径,如viper.SetConfigName(“config”)、viper.SetConfigType(“yaml”…

    2025年12月15日
    000
  • Golang文件I/O结合网络数据流处理

    使用io.Copy实现Go中文件与网络数据流高效对接,避免内存溢出。通过io.Reader和io.Writer统一接口,结合net.Conn与*os.File,可直接流转数据。示例:TCP连接数据写入文件。大文件采用流式处理,bufio提升效率,io.CopyBuffer优化缓冲。HTTP上传时从r…

    2025年12月15日
    000
  • GolangWeb项目数据库连接池使用实践

    Go标准库database/sql内置连接池,通过SetMaxOpenConns、SetMaxIdleConns、SetConnMaxLifetime和SetConnMaxIdleTime合理配置参数可提升性能;2. 全局仅创建一个*sql.DB实例,避免资源浪费,及时关闭Rows或Stmt以释放连…

    2025年12月15日
    000
  • Golang反射获取字段标签默认值实现

    答案是通过反射读取结构体字段的default标签并在字段为零值时设置默认值。例如User结构体中Name默认为guest、Age为18,使用reflect遍历字段,解析default标签并赋值非零值字段。 在 Go 语言中,反射(reflect)可以用来动态获取结构体字段的信息,包括字段上的标签(t…

    2025年12月15日
    000
  • Golangvendor目录管理与依赖锁定方法

    答案:Go项目通过go modules结合vendor目录实现依赖的高效管理与锁定。首先利用go.mod和go.sum文件声明并锁定依赖版本与内容哈希,确保可复现性与安全性;随后执行go mod vendor将依赖复制到本地vendor目录,支持离线构建、提升一致性并避免外部网络风险。在严格隔离或高…

    2025年12月15日
    000
  • Golang匿名结构体定义与应用示例

    匿名结构体是Go中无需命名的临时结构体,用于简化局部数据结构定义。它可直接在变量声明、函数参数、返回值、切片或映射中使用,如:user := struct{ Name string; Age int }{ “Alice”, 25 }。常用于传递配置、构建用户列表或嵌套结构,如…

    2025年12月15日
    000
  • Golang并发队列实现与操作示例

    Golang中通过sync.Mutex和sync.Cond结合container/list实现并发队列,确保多Goroutine下安全存取。 Golang中实现并发队列,核心在于确保多个Goroutine在同时存取数据时,不会发生竞态条件导致数据损坏或逻辑错误。我们通常会借助Go语言自带的并发原语,…

    2025年12月15日
    000
  • Golang微服务间通信模式解析与实现

    Golang微服务通信主要有同步(HTTP/gRPC)和异步(消息队列)模式,结合服务发现与安全、监控措施,根据场景选择合适方式以实现高效、安全、可维护的系统架构。 微服务间通信,说白了,就是不同的服务之间如何互相“说话”。Golang在微服务架构中应用广泛,因此理解其通信模式至关重要。核心在于选择…

    2025年12月15日
    000
  • 为一个简单的Golang Web应用编写单元测试的完整流程

    先编写测试用例验证HTTP处理函数的响应状态码、Content-Type头、JSON响应体是否符合预期。使用net/http/httptest创建请求和记录响应,通过testing包断言结果。示例测试检查GET请求返回200状态码、application/json类型及{“text&#8…

    2025年12月15日
    000
  • Golang值类型与引用类型对比及注意事项

    值类型直接存储数据,赋值时复制整个值,如int、struct;引用类型存储地址,赋值时复制引用,如slice、map;使用引用类型需注意nil判断、并发安全及深拷贝需求。 Golang中的值类型和引用类型,核心区别在于它们在内存中的存储方式以及赋值和传递时的行为。值类型直接存储数据,而引用类型存储数…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信