ホームページ  >  記事  >  バックエンド開発  >  クイック スタート: Go 言語関数を使用して簡単なメッセージ プッシュ関数を実装する

クイック スタート: Go 言語関数を使用して簡単なメッセージ プッシュ関数を実装する

WBOY
WBOYオリジナル
2023-07-31 14:09:13899ブラウズ

クイック スタート: Go 言語関数を使用して簡単なメッセージ プッシュ機能を実装する

今日のモバイル インターネット時代では、メッセージ プッシュはさまざまな APP の標準機能になりました。 Go 言語は高速かつ効率的なプログラミング言語であり、メッセージ プッシュ関数の開発に非常に適しています。この記事では、Go 言語関数を使用して簡単なメッセージ プッシュ関数を実装する方法を紹介し、読者がすぐに使い始めるのに役立つ対応するコード例を示します。

始める前に、メッセージ プッシュの基本原則を理解する必要があります。通常、メッセージ プッシュ機能には、プッシュ サーバーと受信クライアントという 2 つの主要コンポーネントが必要です。プッシュ サーバーは、クライアントから送信されたメッセージを受信し、対応する受信クライアントにメッセージをプッシュする役割を果たします。受信クライアントは、プッシュされたメッセージを受信し、それに応じて処理する責任があります。

まず、単純なプッシュ サーバーを作成しましょう。 Go 言語の net/http パッケージを使用して HTTP サーバーを作成し、メッセージのプッシュに WebSocket プロトコルを使用します。以下は、単純なプッシュ サーバーのサンプル コードです。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var clients = make(map[*websocket.Conn]bool) // 存储所有连接的客户端

var broadcast = make(chan []byte) // 接收消息的通道

var upgrader = websocket.Upgrader{} // WebSocket升级器

func main() {
    http.HandleFunc("/", handleMessage)
    go handleMessages()
    log.Println("Server running on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

func handleMessage(w http.ResponseWriter, r *http.Request) {
    // 将HTTP连接升级为WebSocket连接
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }

    // 将连接添加到clients映射表中
    clients[conn] = true

    // 关闭连接时从clients映射表中删除连接
    defer func() {
        delete(clients, conn)
        conn.Close()
    }()

    for {
        // 读取客户端发送的消息
        _, message, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            break
        }

        // 将消息发送到broadcast通道中
        broadcast <- message
    }
}

func handleMessages() {
    for {
        // 从broadcast通道中读取消息
        message := <-broadcast

        // 向所有连接的客户端发送消息
        for client := range clients {
            err := client.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                log.Println(err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

上記のコードは、WebSocket サーバーを作成し、接続の処理、メッセージの受信、およびメッセージの送信を行うロジックを実装します。新しいクライアントがサーバーに接続すると、サーバーはそのクライアントをクライアント マッピング テーブルに追加し、受信したメッセージをコルーチンを通じて処理してすべてのクライアントに送信します。

次に、サーバーによってプッシュされたメッセージを受信して​​表示する単純なクライアントを作成しましょう。以下は、コマンド ラインに基づく単純なクライアントのサンプル コードです。

package main

import (
    "fmt"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"

    "github.com/gorilla/websocket"
)

func main() {
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/"}
    log.Printf("connecting to %s", u.String())

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    done := make(chan struct{})

    // 接收和显示服务器推送的消息
    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            fmt.Printf("received: %s
", message)
        }
    }()

    for {
        select {
        case <-done:
            return
        case <-interrupt:
            log.Println("interrupt")
            // 断开与服务器的连接
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            return
        }
    }
}

上記のコードは、WebSocket クライアントを作成し、前に作成したサーバーに接続し、サーバーによってプッシュされたメッセージを受信して​​表示します。コルーチンを介したリアルタイム。割り込み信号を受信すると、クライアントはサーバーから切断されます。

上記の 2 つのコードを実行すると、コマンド ラインで単純なメッセージ プッシュ システムをシミュレートできます。ユーザーがメッセージを入力すると、サーバーはそのメッセージをすべてのクライアントにプッシュし、クライアントに表示します。これは単なる単純な例であり、実際のニーズに応じて拡張およびカスタマイズできます。

概要
この記事では、Go 言語関数を使用して簡単なメッセージ プッシュ関数を実装する方法を紹介します。 WebSocket プッシュ サーバーを作成し、サーバーによってプッシュされたメッセージを受信して​​表示するための単純なクライアントを作成しました。この記事のサンプル コードを通じて、読者はメッセージ プッシュ機能を実装するための Go 言語の基本原理をすぐに理解し、理解することができます。

以上がクイック スタート: Go 言語関数を使用して簡単なメッセージ プッシュ関数を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。