golang Websocket チュートリアル: オンライン質疑応答機能の開発方法

WBOY
リリース: 2023-12-02 10:14:49
オリジナル
563 人が閲覧しました

golang Websocket教程:如何开发在线问答功能

golang Websocket チュートリアル: オンライン Q&A 機能を開発する方法、具体的なコード例が必要です

インターネットが発達した今日の時代では、オンライン Q&A プラットフォームは人々のためのプラットフォームになりました知識を獲得し、経験や問題を解決する重要な方法を共有します。即時性と双方向性に対するユーザーのニーズを満たすには、Websocket テクノロジーを使用してオンラインの質問と回答機能を実装するのが良い選択です。この記事では、Golang を使用して Websocket をベースにしたオンライン質疑応答機能を開発する方法と、具体的なコード例を紹介します。

1. プロジェクトの準備
チュートリアルを始める前に、いくつかの準備をする必要があります:

  1. Golang のインストール: まず、コンピューターに Golang がインストールされていることを確認してください。 Golang 公式 Web サイトからダウンロードしてインストールします。
  2. 必要なライブラリをインストールします。Websocket 機能を実装するには、Golang のゴリラ/WebSocket ライブラリを使用します。次のコマンドでインストールできます:
    go get github.com/gorilla/websocket
  3. プロジェクト ディレクトリ構造を作成します: 作業パスにプロジェクト ファイルを保存する新しいフォルダーを作成します。

2. Websocket サーバーの作成
最初に、クライアント接続とメッセージ配信を処理するための Websocket サーバーを作成する必要があります。プロジェクト ディレクトリに server.go という名前のファイルを作成し、次のコードを追加します。

package main

import (
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

// 定义全局变量用于存储连接的客户端
var clients = make(map[*websocket.Conn]bool)

// 定义通道用于传递消息
var broadcast = make(chan Message)

// 定义消息结构体
type Message struct {
    Username string `json:"username"`
    Content  string `json:"content"`
}

// 定义升级HTTP请求为Websocket的方法
var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

// 处理Websocket连接
func handleConnections(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // 将连接的客户端添加到全局变量中
    clients[conn] = true

    for {
        var msg Message
        err := conn.ReadJSON(&msg)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, conn)
            break
        }
        broadcast <- msg
    }
}

// 处理广播消息
func handleMessages() {
    for {
        msg := <-broadcast
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

func main() {
    http.HandleFunc("/ws", handleConnections)
    go handleMessages()
    log.Println("Server start on http://localhost:8000")
    log.Fatal(http.ListenAndServe(":8000", nil))
}
ログイン後にコピー

上記のコードは、接続されているすべてのクライアントにクライアント メッセージをブロードキャストする単純な Websocket サーバーを実装します。

3. Websocket クライアントの作成
次に、ユーザーがフロントエンド ページでメッセージを送受信するための Websocket クライアントを作成する必要があります。プロジェクト ディレクトリに client.go という名前のファイルを作成し、次のコードを追加します。

package main

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

    "github.com/gorilla/websocket"
)

// 定义消息结构体
type Message struct {
    Username string
    Content  string
}

func main() {
    // 创建WebSocket连接
    u := url.URL{Scheme: "ws", Host: "localhost:8000", Path: "/ws"}
    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    // 监听系统信号
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    // 创建一个通道用于接收消息
    done := make(chan struct{})

    // 创建一个协程来监听用户输入并发送消息
    go func() {
        for {
            var msg Message
            err := c.ReadJSON(&msg)
            if err != nil {
                log.Println("read:", err)
                close(done)
                return
            }
            log.Printf("received: %v", msg)
        }
    }()

    // 创建一个协程来发送消息给服务器
    go func() {
        ticker := time.NewTicker(time.Second)
        defer ticker.Stop()

        for {
            select {
            case <-done:
                return
            case t := <-ticker.C:
                err := c.WriteJSON(Message{Username: "Alice", Content: "Hello, World!"})
                if err != nil {
                    log.Println("write:", err)
                    return
                }
                log.Printf("sent: %v", t.String())
            }
        }
    }()

    // 等待系统信号
    <-interrupt
    log.Println("interrupt")

    // 关闭连接
    err = c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
    if err != nil {
        log.Println("write close:", err)
    }
    select {
    case <-done:
    case <-time.After(time.Second):
    }
    log.Println("server closed")
}
ログイン後にコピー

上記のコードは、サーバーに毎秒メッセージを送信し、受信したニュースを印刷する Websocket クライアントを作成します。

4. コンパイルと実行
プロジェクト ディレクトリでターミナルを開き、次のコマンドを実行してプロジェクトをコンパイルして実行します:

  1. コンパイル サーバー
    go build server .go
  2. サーバーを実行します
    ./server
  3. クライアントをコンパイルします
    go build client.go
  4. クライアントを実行します
    ./client

5. テスト機能
ブラウザで http://localhost:8000 にアクセスし、コンソールを開くと、クライアントから送信されたメッセージと他のクライアントからのブロードキャスト メッセージが表示されます。コンソールにメッセージを入力して Enter キーを押してみると、接続されているすべてのクライアントにメッセージがブロードキャストされます。

6. 概要
このチュートリアルでは、Golang と Websocket テクノロジを使用して、簡単なオンライン質問と回答機能を開発する方法を紹介します。このチュートリアルを学習すると、Websocket サーバーとクライアントの作成方法を理解し、関連するテクノロジをプロジェクトに適用できるようになります。このチュートリアルがあなたのお役に立てば幸いです。また、プログラミングを楽しく学習できることを願っています。

以上がgolang Websocket チュートリアル: オンライン質疑応答機能の開発方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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