当前位置:首页 > 行业动态 > 正文

golang web socket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。其最大特点之一就是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话。Go语言标准包里面没有提供对WebSocket的支持,但是在由官方维护的go.net子包中有对这个的支持。您可以通过如下的命令获取该包: go get golang.org/x/net/websocket

WebSocket在Golang中的应用实践

WebSocket是一种在单个TCP连接上进行全双工通信的协议,它使得浏览器和服务器之间可以实现实时双向通信,从而提高了用户体验,在Golang中,我们可以使用gorilla/websocket库来实现WebSocket服务器和客户端的功能,本文将介绍如何在Golang中使用WebSocket进行实时通信,并提供一些实践案例。

安装gorilla/websocket

我们需要安装gorilla/websocket库,在终端中输入以下命令:

go get github.com/gorilla/websocket

创建WebSocket服务器

1、导入相关包:

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

2、定义处理WebSocket连接的函数:

func handleConnections(w http.ResponseWriter, r *http.Request) {
 // 将HTTP连接升级为WebSocket连接
 ws, err := upgrader.Upgrade(w, r, nil)
 if err != nil {
  fmt.Println("Error upgrading connection:", err)
  return
 }
 defer ws.Close()
 for {
  // 读取客户端发送的消息
  _, message, err := ws.ReadMessage()
  if err != nil {
   fmt.Println("Error reading message:", err)
   break
  }
  fmt.Printf("Received message: %s
", message)
  // 将收到的消息原样返回给客户端
  err = ws.WriteMessage(websocket.TextMessage, message)
  if err != nil {
   fmt.Println("Error writing message:", err)
   break
  }
 }
}

3、在主函数中启动HTTP服务器并监听WebSocket连接:

func main() {
 http.HandleFunc("/ws", handleConnections)
 http.ListenAndServe(":8080", nil)
}

至此,我们已经创建了一个简单的WebSocket服务器,客户端可以通过访问ws://localhost:8080/ws与服务器建立连接并进行实时通信。

创建WebSocket客户端

1、我们需要导入相关包:

import (
 "fmt"
 "log"
 "os"
 "time"
 "github.com/gorilla/websocket"
)

2、我们可以编写一个简单的WebSocket客户端,用于与服务器进行通信:

func main() {
 // 建立WebSocket连接到服务器
 conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
 if err != nil {
  log.Fatal("Error connecting to server:", err)
 }
 defer conn.Close()
 defer os.Exit(0)
 // 每隔5秒向服务器发送一条消息,并接收一条回复消息打印出来
 for i := 0; i < 5; i++ {
  go func() { time.Sleep(5 * time.Second); conn.WriteMessage(websocket.TextMessage, []byte("Hello from client")) }()
  msgType, msg, err := conn.ReadMessage() // 这里会阻塞等待服务器的回复消息,所以需要放在goroutine中执行以避免阻塞主线程,如果不需要阻塞等待,可以直接调用conn.ReadMessage(),err为nil表示收到了回复消息,如果err非nil,表示连接已关闭或发生错误,msg即为收到的回复消息。    fmt.Printf("Received message: %s
", msg)    }()
0