自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

兩個 Go 程序之間的 WebSocket 通信

開發(fā) 后端
實現(xiàn)兩個 Go 服務(wù)之間做 WebSocket 通信要怎么做?本文做了介紹。

 [[440851]]

實現(xiàn)兩個 Go 服務(wù)之間做 WebSocket 通信要怎么做?本文做了介紹。

使用 WebSockets 時,一個程序必須充當(dāng)服務(wù)器。

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

WebSocket Server

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

下面是運(yùn)行在端口 8080 上的 WebSocket 服務(wù)器的代碼 

  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.     }))  

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

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

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.     }  

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

測試

左側(cè),服務(wù)器結(jié)果 右側(cè),客戶端結(jié)果

客戶端每 5 秒向服務(wù)器發(fā)送一個隨機(jī)數(shù)。服務(wù)器用另一個隨機(jī)數(shù)回復(fù)

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

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

因為 Go 經(jīng)常用于服務(wù)和/或微服務(wù),所以在這些服務(wù)之間進(jìn)行通信是有意義的 。

 

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

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

程序員結(jié)對編程

2015-02-05 09:54:13

程序員

2023-10-04 20:03:46

GOkeyvalue

2020-03-26 15:12:35

程序線程協(xié)程

2013-12-18 10:34:42

OpenMP線程

2012-12-21 09:19:29

Google GO

2013-05-10 09:31:06

程序員

2021-03-19 11:05:50

Linux目錄命令

2022-06-17 09:46:51

Chrome 102Chrome瀏覽器

2009-07-15 18:29:22

Jython應(yīng)用

2010-07-02 12:26:51

LEACH協(xié)議

2025-03-12 00:22:00

2020-03-02 11:47:27

區(qū)塊鏈存儲應(yīng)用程序

2021-01-11 16:30:40

SQL數(shù)據(jù)庫函數(shù)

2019-08-20 16:23:54

數(shù)據(jù)安全服務(wù)器IT

2017-04-10 14:35:35

SambaRsyncSysVol
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號