golang Websocket チュートリアル: オンライン Q&A 機能を開発する方法、具体的なコード例が必要です
インターネットが発達した今日の時代では、オンライン Q&A プラットフォームは人々のためのプラットフォームになりました知識を獲得し、経験や問題を解決する重要な方法を共有します。即時性と双方向性に対するユーザーのニーズを満たすには、Websocket テクノロジーを使用してオンラインの質問と回答機能を実装するのが良い選択です。この記事では、Golang を使用して Websocket をベースにしたオンライン質疑応答機能を開発する方法と、具体的なコード例を紹介します。
1. プロジェクトの準備
チュートリアルを始める前に、いくつかの準備をする必要があります:
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. コンパイルと実行
プロジェクト ディレクトリでターミナルを開き、次のコマンドを実行してプロジェクトをコンパイルして実行します:
5. テスト機能
ブラウザで http://localhost:8000 にアクセスし、コンソールを開くと、クライアントから送信されたメッセージと他のクライアントからのブロードキャスト メッセージが表示されます。コンソールにメッセージを入力して Enter キーを押してみると、接続されているすべてのクライアントにメッセージがブロードキャストされます。
6. 概要
このチュートリアルでは、Golang と Websocket テクノロジを使用して、簡単なオンライン質問と回答機能を開発する方法を紹介します。このチュートリアルを学習すると、Websocket サーバーとクライアントの作成方法を理解し、関連するテクノロジをプロジェクトに適用できるようになります。このチュートリアルがあなたのお役に立てば幸いです。また、プログラミングを楽しく学習できることを願っています。
以上がgolang Websocket チュートリアル: オンライン質疑応答機能の開発方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。