您的当前位置:首页>全部文章>文章详情

【Go】使用Go语言创建WebSocket服务器和客户端

CrazyPanda发表于:2024-02-29 23:44:40浏览:343次TAG:

WebSocket 是一种新型的网络通信协议,可以在 Web 应用程序中实现双向通信。在这篇文章中,我们将介绍如何使用 Go 语言编写一个简单的 WebSocket 服务器。

首先,我们需要使用 Go 的 net/http 包创建一个 HTTP 服务器。在这个服务器中,我们将创建一个用于处理 WebSocket 连接的函数 handleWebSocket。在该函数中,我们将使用 gorilla/websocket 包来处理 WebSocket 连接。

goCopy code
package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func main() {
    // 创建HTTP服务器
    http.HandleFunc("/ws", handleWebSocket)
    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    // 升级HTTP连接为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    // 处理WebSocket连接
    for {
        // 读取消息
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        log.Println("Received message:", string(p))

        // 发送消息
        err = conn.WriteMessage(messageType, []byte("Hello, world!"))
        if err != nil {
            log.Println(err)
            return
        }
    }
}

在这个示例中,我们使用 gorilla/websocket 包创建了一个 WebSocket 服务器。我们创建了一个 upgrader 实例,并将其用于升级 HTTP 连接为 WebSocket 连接。然后,我们在 handleWebSocket 函数中处理 WebSocket 连接。在该函数中,我们使用 conn.ReadMessage 方法读取从客户端发送的消息,并使用 conn.WriteMessage 方法将消息发送回客户端。

要测试这个 WebSocket 服务器,我们可以使用任何 WebSocket 客户端。例如,我们可以使用浏览器的 JavaScript WebSocket API。以下是一个简单的 HTML 文件,使用 JavaScript WebSocket API 连接到我们的 WebSocket 服务器:

htmlCopy code
<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <script>
        var ws = new WebSocket("ws://localhost:8080/ws");
        ws.onopen = function() {
            console.log("WebSocket connection opened.");
        };
        ws.onmessage = function(event) {
            console.log("Received message: " + event.data);
        };
        ws.onclose = function() {
            console.log("WebSocket connection closed.");
        };
        ws.onerror = function(event) {
            console.log("WebSocket error: " + event.data);
        };
    </script>
</body>
</html>

在这个示例中,我们使用 JavaScript WebSocket API 创建了一个 WebSocket 连接,并打印连接状态和收到的消息。要测试这个 HTML 文件,我们可以使用任何支持 WebSocket 的浏览器来打开这个 HTML 文件,例如 Chrome 或 Firefox。当我们打开这个 HTML 文件时,它会自动连接到我们的 WebSocket 服务器,并显示连接状态和收到的消息。

除了使用浏览器的 JavaScript WebSocket API,我们还可以使用其他 WebSocket 客户端库,例如 Go 的 gorilla/websocket 包。以下是一个简单的 Go WebSocket 客户端示例:

goCopy code
package main

import (
    "log"
    "github.com/gorilla/websocket"
)

func main() {
    // 连接WebSocket服务器
    conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 发送消息
    err = conn.WriteMessage(websocket.TextMessage, []byte("Hello, world!"))
    if err != nil {
        log.Fatal(err)
    }

    // 读取消息
    messageType, p, err := conn.ReadMessage()
    if err != nil {
        log.Fatal(err)
    }
    log.Println("Received message:", string(p))
}

在这个示例中,我们使用 websocket.DefaultDialer.Dial 方法连接到我们的 WebSocket 服务器,并使用 conn.WriteMessage 方法发送消息。然后,我们使用 conn.ReadMessage 方法读取从服务器返回的响应消息。

这些示例展示了如何使用 Go 语言创建一个简单的 WebSocket 服务器和客户端。使用 WebSocket 协议可以实现高效、实时的双向通信,这在许多实时应用程序中非常有用,例如聊天应用程序、多人游戏和在线协作工具。


猜你喜欢

【Go】Go语言常用命令详解(二)
前言接着上一篇继续介绍Go语言的常用命令常用命令以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和管理依赖项等任务。命令描述go build编译Go程序包及其依赖项。go test运行包的测试。go run编译并运行Go程序。go clean删除编译生成的对象文件和缓存文件。go bug启动一个用于报告bug的工具。go doc显示有关包或符号的文档。go env打印有关Go环境的信息。go fix更新包以使用新的API。go fmt使用gofmt重新格式化Go包的源
发表于:2024-03-07 浏览:336 TAG:
【Go】Golang打包go项目部署到linux服务器正确方法
网上方法正确方法总结&nbsp;网上方法我们可以在终端中输入以下代码:set&nbsp;CGO_ENABLED=0 set&nbsp;GOOS=linux set&nbsp;GOARCH=amd64 go&nbsp;build&nbsp;-o&nbsp;main-linux&nbsp;main.go然后就会生成main-linux的二进制可执行文件,然后我们就可以将main-linux放到服务器中的任一目录中,然后我们就可以执行以下命令运行。&gt;&nbsp;chmod&nbsp;777&amp;nb
发表于:2024-08-06 浏览:278 TAG: #Golang
【Go】go依赖注入库samber/do使用
介绍以简单和高效而闻名的Go语言在其1.18版本中引入了泛型,这可以显着减少大量代码生成的需要,使该语言更加强大和灵活。如果您有兴趣, Go 泛型教程 是很好的学习资源。通过使用 Go 的泛型,samber/do库为依赖注入 (DI) 提供了一个很好的解决方案。依赖注入是一种重要的设计模式,它促进对象及其依赖关系之间的松散耦合,从而提高代码模块化性、可测试性和可维护性。泛型和依赖注入的结合进一步提升了 Go 在创建高效、可扩展软件方面的潜力。在本文中,您将学习如何使用 samber/do 提供依
发表于:2024-02-24 浏览:343 TAG:
【Go】使用Go语言创建WebSocket服务器和客户端
WebSocket 是一种新型的网络通信协议,可以在 Web 应用程序中实现双向通信。在这篇文章中,我们将介绍如何使用 Go 语言编写一个简单的 WebSocket 服务器。首先,我们需要使用 Go 的 net/http 包创建一个 HTTP 服务器。在这个服务器中,我们将创建一个用于处理 WebSocket 连接的函数 handleWebSocket。在该函数中,我们将使用 gorilla/websocket 包来处理 WebSocket 连接。goCopy&nbsp;code package
发表于:2024-02-29 浏览:344 TAG:
【Go】Golang标准库介绍(五)
1. runtime库 ( 运行时接口)在 Go 语言的标准库中,runtime 包提供了与 Go 运行时系统交互的功能。这个包包括了一些控制和查询运行时状态的函数,如协程控制、垃圾回收、程序退出等。常用的函数:Gosched&nbsp;函数:&nbsp;让出处理器给其他&nbsp;goroutine&nbsp;执行,以便调度器能够有效地分配时间给不同的&nbsp;goroutine。 Go&nbsp;函数:&nbsp;用于启动一个新的&nbsp;goroutine。 NumCPU&nbsp;函
发表于:2024-03-05 浏览:296 TAG:
【Go】windows系统go语言环境搭建
下载地址 Go官网下载地址:https://studygolang.com/dl一、下载对应电脑得安装包二、下载完成点击安装下一步(选择目录尽量简单)三、是否安装成功四、环境变量GOROOT和GOPATH都是环境变量,其中GOROOT是我们安装go开发包的路径,而从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH设置一个默认目录,并且在Go1.14及之后的版本中启用了Go Module模式之后,不一定非要将代码写到GOPATH目录下,所以也就不需要我们再自己配置GOPATH了,使用默
发表于:2024-02-24 浏览:318 TAG:
【Go】Golang标准库介绍(四)
1. Net库 (网络库,支持 Socket、HTTP、邮件、RPC、SMTP 等)在 Go 语言的标准库中,net 包提供了对网络操作的支持,包括基本的网络协议、Socket 编程、HTTP 客户端和服务器等。net 包包含多个子包,其中一些主要的子包包括 net/http、net/url、net/rpc 等。重要的子包和功能net/http:&nbsp;提供了用于构建&nbsp;HTTP&nbsp;客户端和服务器的功能,包括处理请求和响应、创建路由、设置中间件等。 net/url:&amp;nbs
发表于:2024-03-04 浏览:281 TAG:
【Go】Go语言工程结构详述
前言当创建一个Go语言项目时,良好的工程结构是确保项目可维护性、可扩展性和清晰性的关键。虽然Go本身没有强制性的项目结构要求,但是采用一致性的布局和组织方式能够让团队更容易理解和维护代码。在Go语言中,项目结构可以根据具体需求有所不同,但通常遵循一些共同的约定。以下是一个通用的Go语言工程结构的示例:myproject/ |--&nbsp;cmd/ |&nbsp;&nbsp;&nbsp;|--&nbsp;myapp/ |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;n
发表于:2024-03-05 浏览:329 TAG:
【Go】windows系统Go语言环境安装
1. Go语言安装包下载打开官网https://golang.google.cn/dl/,找到windows版本,点击下载,然后点击安装包安装,可自定义安装路径。2. GOROOT环境变量配置打开系统环境变量,新加GOROOT,路径就是Go安装根路径3. GOPATH环境变量添加在添加GOPATH环境变量之前,我们需要先新建一个工作区文件夹,这里笔者以GoProject命名。然后在该文件夹下分别创建src, pkg, bin三个文件夹,这三个文件夹作用如下:src: 存放源代码(go项目存放的位
发表于:2024-06-07 浏览:322 TAG:
【Go】Golang标准库介绍(二)
1. debug 库 (各种调试文件格式访问及调试功能在 Go 语言的标准库中,并没有一个名为 debug 的独立库。然而,Go 提供了一系列的工具和包,用于调试和性能分析。这些工具和包包括 debug/pprof、runtime/pprof、net/http/pprof 等,用于生成和分析性能剖析数据。相关的包和工具:1.&nbsp;runtime/pprof:&nbsp;提供了运行时性能分析的功能,可以用于查看&nbsp;CPU&nbsp;和内存的使用情况。它通过在代码中插入特殊的语句来收集
发表于:2024-03-03 浏览:273 TAG: