golang实现websocket

2023-05-22 14:05:48 websocket Golang

随着互联网技术的不断发展,实时连接成为了越来越多应用的必备功能。websocket 是一种基于 tcp 协议的网络协议,它允许服务器向客户端推送数据,实现实时双向通信。

Go 是一门快速高效的编程语言,由于其简洁、高效等特点,成为了近年来非常流行的语言之一。在本文中,我们将介绍如何使用 Go 语言实现 WEBSocket 服务。

什么是 WebSocket

WebSocket 协议是一种基于TCP协议的全双工通信协议,允许客户端和服务器之间进行实时通信。相对于传统的 Http 请求和响应模式,WebSocket 可以在连接建立后一直保持连接状态,从而实现实时的双向通信。

WebSocket 协议的工作流程如下:

  1. 客户端发起 WebSocket 连接请求。
  2. 服务器收到请求后进行握手协议,确认可以使用 WebSocket 连接。
  3. WebSocket 连接建立后,客户端和服务器可以进行实时双向通信。
  4. 如果服务器需要向客户端发送数据,可以直接向客户端发送,反之亦然。

相比于传统的HTTP请求,WebSocket的优势在于:

  1. 实时双向通信,适用于在线游戏、实时聊天、在线视频等实时性强的应用场景。
  2. 更少的请求和响应次数,减少网络带宽的消耗,提高数据传输效率。

Go 实现 WebSocket

Go 是一门新兴的语言,由于其简洁、高效、安全等特点,越来越多的团队开始使用 Go 来开发网络应用。在 Go 中,有一个标准库 net/http,提供了实现 HTTP 和 WebSocket 服务的 api

建立 WebSocket 连接

要建立 WebSocket 连接,我们需要在服务端和客户端分别进行如下操作:

服务端

  1. 创建 HTTP 服务,使用 http.HandleFunc 函数注册一个路由器,并允许对应的路由处理函数进行 WebSocket 通信。
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 判断是否支持 WebSocket,如果支持则进入 WebSocket 通信处理函数。
    if websocket.IsWebSocketUpgrade(r) {
        websocket.Handler(handleWebSocket).ServeHTTP(w, r)
        return
    }

    http.ServeFile(w, r, "index.html")
})
  1. 在 WebSocket 通信处理函数中进行建立连接操作。
func handleWebSocket(conn *websocket.Conn) {
    defer conn.Close()

    // 输出日志信息,表示已经建立连接。
    log.Println("WebSocket connected")

    for {
        // 读取客户端发送过来的消息。
        _, msg, err := conn.ReadMessage()
        if err != nil {
            log.Println("Read error:", err)
            return
        }

        // 输出日志信息,表示接收到客户端发送的消息。
        log.Printf("Received: %s
", msg)

        // 处理完毕后,发送消息。
        err = conn.WriteMessage(websocket.TextMessage, msg)
        if err != nil {
            log.Println("Write error:", err)
            return
        }
    }
}

客户端

在客户端中,我们需要使用 javascript 代码进行 WebSocket 连接的操作。具体代码如下:

var socket = new WebSocket("ws://127.0.0.1:8080/");

socket.onopen = function() {
  console.log("WebSocket connected");
};

socket.onmessage = function(event) {
  console.log("Received: " + event.data);
};

socket.onclose = function(event) {
  console.log("WebSocket closed");
};

socket.onerror = function(event) {
  console.log("WebSocket error: " + event.data);
};

发送消息

当 WebSocket 连接建立后,服务端和客户端就可以进行实时双向通信了。服务端可以通过 conn.WriteMessage 函数向客户端发送消息,客户端可以通过 socket.send 函数向服务端发送消息。

从客户端发送消息:

socket.send("Hello world");

在服务端接收并处理消息:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

log.Printf("Received: %s
", msg)

从服务端发送消息:

err = conn.WriteMessage(websocket.TextMessage, []byte("Hello world"))
if err != nil {
    log.Println("Write error:", err)
    return
}

在客户端接收并处理消息:

socket.onmessage = function(event) {
    console.log("Received: " + event.data);
};

WebSocket 的错误处理

在实际开发中,WebSocket 可能会出现各种异常情况,例如网络中断、连接超时、服务器崩溃等。在 Go 中,我们可以通过错误处理来处理这些异常情况。

在服务端中,我们可以通过 defer 语句来进行资源释放,例如关闭 WebSocket 连接等。

defer conn.Close()

同时,在进行 websocket 通信处理函数的过程中,我们需要对可能发生的错误进行预处理。例如:

_, msg, err := conn.ReadMessage()
if err != nil {
    log.Println("Read error:", err)
    return
}

在客户端中,我们可以通过 onerror 事件来处理 WebSocket 的错误,例如:

socket.onerror = function(event) {
    console.log("WebSocket error: " + event.data);
};

总结

本文介绍了如何使用 Go 语言实现 WebSocket 服务,包括建立 WebSocket 连接、发送消息、异常处理等方面。WebSocket 协议提供了一种实时双向通信的方法,可以用于在线游戏、实时聊天、在线视频等实时性强的应用场景。在 Go 中,使用标准库 net/http 提供的 API,可以非常方便地实现 WebSocket 服务。

以上就是golang实现websocket的详细内容,更多请关注其它相关文章!

相关文章