Golang はブロードキャストを実装します

王林
リリース: 2023-05-27 12:39:08
オリジナル
1153 人が閲覧しました

Golang は、Google によって開発された効率的なプログラミング言語です。現代のインターネット分野において、Golang は間違いなく非常に重要なプログラミング言語であり、その優れたパフォーマンスとアプリケーションの高い拡張性は、大規模で高性能なネットワーク アプリケーションの構築に非常に適しています。ここではGolangを使ってブロードキャスト機能を実装する方法を紹介します。

ブロードキャストは、複数のクライアントにメッセージをパブリッシュする方法です。通信プロトコルにおけるブロードキャストとは、ネットワーク上の特定のアドレスに情報パケットを送信し、そのアドレスの近くにあるすべてのコンピューターによってパケットがキャプチャされるようにすることです。通常、ブロードキャストはイベントの発生を全員に通知するために使用されます。

Golang ではブロードキャスト実装により、複数のコネクションに同時にデータを送信することでブロードキャスト機能を実現できます。複数のクライアント接続のリストを使用して、各クライアントにメッセージを送信できます。ここではゴルーチンとチャネルを使用してブロードキャストを実装します。

まず、接続リストを作成する必要があります:

type Client struct { conn net.Conn name string } type ConnectionList struct { clients map[*Client]bool broadcast chan string addClient chan *Client removeClient chan *Client }
ログイン後にコピー

上記のコードでは、Client 構造体はクライアントの接続に関する情報を保存し、ConnectionList 構造体は次のようなクライアント接続リストを保存します。メッセージをブロードキャストするためのチャネルと、接続を追加および削除するためのチャネル。

以下は、接続の追加および削除関数です:

func (list *ConnectionList) add(client *Client) { list.clients[client] = true } func (list *ConnectionList) remove(client *Client) { if _, ok := list.clients[client]; ok { delete(list.clients, client) close(client.conn) } }
ログイン後にコピー

次に、接続を処理し、接続されているすべてのクライアントにメッセージをブロードキャストするためのゴルーチンとチャネルをさらに作成します:

func handleConnection(conn net.Conn, list *ConnectionList) { client := &Client{conn: conn} list.addClient <- client defer func() { list.removeClient <- client }() for { message := make([]byte, 4096) length, err := conn.Read(message) if err != nil || length == 0 { break } data := strings.TrimSpace(string(message[:length])) if len(data) > 0 { list.broadcast <- data } } } func (list *ConnectionList) broadcastMessage() { for { message := <-list.broadcast for client := range list.clients { _, err := client.conn.Write([]byte(message + " ")) if err != nil { list.removeClient <- client } } } } func (list *ConnectionList) handleClients() { for { select { case client := <-list.addClient: list.add(client) case client := <-list.removeClient: list.remove(client) case <-time.After(60 * time.Second): fmt.Println("Keep alive.") } } }
ログイン後にコピー

handleConnection 関数は接続要求を処理し、存在する場合は接続リストに追加されます。ブロードキャスト メッセージは、broadcastMessage 関数を通じて処理されます。最後に、handleClients 関数は永久に実行されるため、接続のリストは長期間アクティブなままになります。

メソッドの結合:

func main() { list := &ConnectionList{ clients: make(map[*Client]bool), broadcast: make(chan string), addClient: make(chan *Client), removeClient: make(chan *Client), } go list.broadcastMessage() go list.handleClients() listen, err := net.Listen("tcp", ":6000") if err != nil { fmt.Println(err) return } defer listen.Close() for { conn, err := listen.Accept() if err != nil { fmt.Println(err) continue } go handleConnection(conn, list) } }
ログイン後にコピー

この簡単な例では、Golang を使用してブロードキャスト メッセージの機能を実装できます。ご覧のとおり、Golang は効率的で信頼性が高く、柔軟性があるため、高性能の分散アプリケーションを構築するのに理想的な選択肢です。

以上がGolang はブロードキャストを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!