成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

兩個 Go 程序之間的 WebSocket 通信

開發 后端
實現兩個 Go 服務之間做 WebSocket 通信要怎么做?本文做了介紹。

 [[440851]]

實現兩個 Go 服務之間做 WebSocket 通信要怎么做?本文做了介紹。

使用 WebSockets 時,一個程序必須充當服務器。

但是可以有許多其他程序作為客戶端。在本文中,我們將創建一個服務器和一個客戶端

WebSocket Server

服務器的代碼非常簡單。因為我們不想重新發明輪子,所以我們將使用gobwas模塊

下面是運行在端口 8080 上的 WebSocket 服務器的代碼 

  1. package main  
  2. import (  
  3.     "fmt"  
  4.     "github.com/gobwas/ws"  
  5.     "github.com/gobwas/ws/wsutil"  
  6.     "math/rand"  
  7.     "net/http"  
  8.     "strconv" 
  9.  
  10. func main() {  
  11.     fmt.Println("Server started, waiting for connection from client")  
  12.     http.ListenAndServe(":8080", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {  
  13.         fmt.Println("Client connected")  
  14.         conn, _, _, err :ws.UpgradeHTTP(r, w)  
  15.         if err != nil {  
  16.             fmt.Println("Error starting socket server: " + err.Error())  
  17.         }  
  18.         go func() {  
  19.             defer conn.Close()  
  20.             for {  
  21.                 msg, op, err :wsutil.ReadClientData(conn)  
  22.                 if err != nil {  
  23.                     fmt.Println("Error receiving data: " + err.Error())  
  24.                     fmt.Println("Client disconnected")  
  25.                     return  
  26.                 }  
  27.                 fmt.Println("Client message received with random number: " + string(msg))  
  28.                 randomNumber :strconv.Itoa(rand.Intn(100))  
  29.                 err = wsutil.WriteServerMessage(conn, op, []byte(randomNumber))  
  30.                 if err != nil {  
  31.                     fmt.Println("Error sending data: " + err.Error())  
  32.                     fmt.Println("Client disconnected")  
  33.                     return  
  34.                 }  
  35.                 fmt.Println("Server message send with random number " + randomNumber)  
  36.             }  
  37.         }()  
  38.     }))  

服務器除了等待連接之外什么都不做,打印接收到的數據并最后發送一條消息(隨機整數)

如果客戶端斷開連接(或有人停止程序),它將打印有關此斷開連接的信息

WebSocket Client

客戶端的代碼類似。同樣,我們將使用gobwas模塊

客戶端正在通過端口 8080 連接到 localhost 

  1. package main  
  2. import (  
  3.     "context"  
  4.     "fmt"  
  5.     "github.com/gobwas/ws"  
  6.     "github.com/gobwas/ws/wsutil"  
  7.     "math/rand"  
  8.     "os"  
  9.     "strconv"  
  10.     "time"  
  11.  
  12. func main() {  
  13.     fmt.Println("Client started")  
  14.     for {  
  15.         conn, _, _, err :ws.DefaultDialer.Dial(context.Background(), "ws://127.0.0.1:8080/")  
  16.         if err != nil {  
  17.             fmt.Println("Cannot connect: " + err.Error())  
  18.             time.Sleep(time.Duration(5) * time.Second)  
  19.             continue  
  20.         }  
  21.         fmt.Println("Connected to server")  
  22.         for i :0; i < 10; i++ {  
  23.             randomNumber :strconv.Itoa(rand.Intn(100))  
  24.             msg := []byte(randomNumber)  
  25.             err = wsutil.WriteClientMessage(conn, ws.OpText, msg)  
  26.             if err != nil {  
  27.                 fmt.Println("Cannot send: " + err.Error())  
  28.                 continue  
  29.             }  
  30.             fmt.Println("Client message send with random number " + randomNumber)  
  31.             msg, _, err :wsutil.ReadServerData(conn)  
  32.             if err != nil {  
  33.                 fmt.Println("Cannot receive data: " + err.Error())  
  34.                 continue  
  35.             }  
  36.             fmt.Println("Server message received with random number: " + string(msg))  
  37.             time.Sleep(time.Duration(5) * time.Second)  
  38.         }  
  39.         err = conn.Close()  
  40.         if err != nil {  
  41.             fmt.Println("Cannot close the connection: " + err.Error())  
  42.             os.Exit(1)  
  43.         }  
  44.         fmt.Println("Disconnected from server")  
  45.     }  

這個客戶端除了連接、發送消息(隨機整數)并打印發回的任何內容之外沒有什么特別的

測試

左側,服務器結果 右側,客戶端結果

客戶端每 5 秒向服務器發送一個隨機數。服務器用另一個隨機數回復

如果您停止服務器,您將在客戶端看到服務器已斷開連接。如果您再次啟動服務器,客戶端將再次連接。

您可以以另一種方式期待相同的行為。如果停止客戶端,服務器將打印一條消息,表明客戶端已斷開連接。如果您再次運行客戶端......好吧,它再次連接

因為 Go 經常用于服務和/或微服務,所以在這些服務之間進行通信是有意義的 。

 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2011-04-15 09:47:38

IntentActivityAndroid

2020-08-14 08:13:49

列表差異編程

2021-11-30 06:56:58

編譯Go程序

2010-07-25 14:31:54

Telnet程序

2013-07-05 10:52:07

程序員結對編程

2015-02-05 09:54:13

程序員

2023-10-04 20:03:46

GOkeyvalue

2020-03-26 15:12:35

程序線程協程

2012-12-21 09:19:29

Google GO

2013-12-18 10:34:42

OpenMP線程

2013-05-10 09:31:06

程序員

2021-03-19 11:05:50

Linux目錄命令

2025-06-10 07:09:00

2022-06-17 09:46:51

Chrome 102Chrome瀏覽器

2009-07-15 18:29:22

Jython應用

2010-07-02 12:26:51

LEACH協議

2025-03-12 00:22:00

2024-09-29 10:39:48

RSocketWebSocket通信

2020-03-02 11:47:27

區塊鏈存儲應用程序

2019-08-20 16:23:54

數據安全服務器IT
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91私密视频 | 亚洲狠狠 | 国产在线视频99 | 91综合在线视频 | 91精品中文字幕一区二区三区 | 国产丝袜一区二区三区免费视频 | 中文字幕免费观看 | 欧美日韩久久 | 久久国产精品一区二区三区 | 三级视频久久 | 99久久婷婷国产综合精品电影 | 国产高清精品在线 | 日韩免费视频 | 亚欧午夜 | 日朝毛片 | 亚洲日韩视频 | 成人二区 | 天天天天天天天干 | 精品成人一区二区 | 亚洲a在线观看 | 久久久123| 国产精品成人一区 | 99爱在线免费观看 | 亚洲视频在线免费 | 狠狠干狠狠操 | 99精品观看 | 日韩视频免费在线 | 日韩视频在线播放 | 午夜欧美一区二区三区在线播放 | 国产一区欧美 | 国产999精品久久久久久绿帽 | 日韩欧美在线不卡 | 亚洲国产精品一区二区第一页 | 国内在线视频 | 久久男人| 亚洲一一在线 | 国产一区二区三区 | 欧美日韩亚洲国产综合 | 一区二区日韩 | 日本天天操 | 日韩色视频 |