如何在 Go 中创建 WebSocket 应用程序

眼前多少难甘事,自古男儿当自强。这篇文章主要讲述如何在 Go 中创建 WebSocket 应用程序相关的知识,希望能为你提供帮助。
【如何在 Go 中创建 WebSocket 应用程序】
如何在 Go 中创建 WebSocket 应用程序上一篇文章我们先介绍了什么是 WebSockets 协议。本篇文章将来介绍如何利用 Go 来实现一个要基于 net/http 库编写一个简单的 WebSocket 响应服务器,您需要:

  1. 建立握手
  2. 从客户端接收数据帧
  3. 向客户端发送数据帧
  4. 关闭握手
WebSockets 无需客户端事先请求即可从服务器传输数据,允许来回传递消息并保持连接打开,直到客户端或服务器终止它。因此,可以在客户端和服务器之间进行双向实时数据传输。 WebSocket 通信通常通过 TCP 端口号 443 完成。WebSocket 协议规范定义了两种 URI 方案:
  • WebSocket (ws):用于非加密连接
  • WebSocket Secure (wss):用于加密连接
建立 HTTP 服务器WebSockets 建立在 HTTP 之上,所以首先,我们将设置一个基本的 HTTP 服务器,它可以接受客户端连接并提供消息。将以下代码添加到您的 server.go 文件中:
package main

import (
"fmt"
"net/http"
)

func main()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request)
fmt.Fprintf(w, "Welcome to the server!\\n")
)

http.ListenAndServe(":8080", nil)


通过运行 ??go run server.go??启动服务器。当您访问 ??localhost:8080?? 时,您应该会看到以下输出:


Welcome to the server!

发起握手由于开销较小,WebSocket 可以在 Web 服务器和 Web 浏览器或客户端应用程序之间实现实时通信和快速数据传输。 WebSocket 通信发起一个握手,它使用 HTTP Upgrade() 标头从 HTTP 协议更改为 WebSocket 协议。要建立 WebSocket 连接,需要在客户端和服务器之间进行一次握手。握手使用 Upgrade() 方法将 HTTP 服务器连接升级到 WebSocket 协议。一旦服务器停止,我们还将使用 defer 关闭连接。现在,我们修改 ??server.go?? 文件,建立一个 WebSocket 握手:


  1. 首先,我们需要获取??gorilla/websocket??库:
$ go get github.com/gorilla/websocket

  1. 定义一个 upgrader 结构,用来保存 WebSocket 连接的读取和写入缓冲区大小等信息:
var upgrader = websocket.Upgrader
ReadBufferSize:1024,
WriteBufferSize: 1024,

  1. 然后更改??server.go?? 代码:
package main

import (
"fmt"
"net/http"

"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader
ReadBufferSize:1024,
WriteBufferSize: 1024,


func main()
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request)
conn, _ := upgrader.Upgrade(w, r, nil) // error ignored for sake of simplicity

for
// Read message from browser
msgType, msg, err := conn.ReadMessage()
if err != nil
return


// Print the message to the console
fmt.Printf("%s sent: %s\\n", conn.RemoteAddr(), string(msg))

// Write message back to browser
if err = conn.WriteMessage(msgType, msg); err != nil
return


)

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request)
http.ServeFile(w, r, "websockets.html")
)

http.ListenAndServe(":8080", nil)

  1. 新建一个??websockets.html?? 文件,写入如下代码:

< input id="input" type="text" />
< button onclick="send()"> Send

推荐阅读