golang はシンプルなウェブソケット・チャットルーム機能を実装しています。
2022-02-15 11:11:44
基本中の基本。
1. golang.org/x/net/websocket パッケージが導入されました。
2. ポートでリスニングする。
3. クライアントが接続すると、その構造体を送信する。{"type":"login","uid":"I am username","msg":"Login successful"}' ...という構造体を送信します。ログイン情報を元に、サーバーは異なるユーザーの接続ボディを保持するマップを保持します。
4. ユーザーが発言したら、その内容をmsgにポーリングする。
5. クライアントとしてjsのwebsocket機能を使用し、チャットを開始します。
欠点:クライアントから渡されたuidを元にユーザーを区別しているだけで、本人確認はしていませんが、デモには必要ないでしょう。
サーバーのコードです。
package main
import (
"encoding/json"
"fmt"
"golang.org/x/net/websocket"
"log"
"net/http"
)
//ProxyConfig configuration
type MsgConfig struct {
Type string `json:"type,omitempty"`
Uid string `json:"uid,omitempty"`
Msg string `json:"msg,omitempty"`
}
var connMap = make(map[string]*websocket.Conn)
func Echo(ws *websocket.Conn) {
var err error
for {
var reply string
Receive(ws, &reply); if err = websocket. = nil {
fmt.Println("Can't receive")
break
}
replyMsg := MsgConfig{}
json.Unmarshal([]byte(reply), &replyMsg)
if replyMsg.Type == "login" && replyMsg.Uid ! = "" {
connMap[replyMsg.Uid] = ws
fmt.Println(connMap)
}
for k, v := range connMap {
go sendMessage(replyMsg, v, k)
}
}
}
func sendMessage(replyMsg MsgConfig, conn *websocket.Conn, connUid string) {
msg := replyMsg.Uid + "say:" + replyMsg.Msg
if connUid == replyMsg.Uid {
fmt.Println(msg)
if replyMsg.Type == "login" {
msg = "Login successful"
} else {
msg = "You said:" + replyMsg.Msg
}
}
if err := websocket.Message.Send(conn, msg); err ! = nil {
fmt.Println("Can't send")
}
}
func main() {
http.Handle("/", websocket.Handler(Echo))
if err := http.ListenAndServe(":1234", nil); err ! = nil {
log.Fatal("ListenAndServe:", err)
}
}
クライアント側のチャットです。
以下のコードをブラウザのコンソール内に入力することで、チャットを行うことができます。
//ip:portはお好みのものを設定
ws = new WebSocket("ws://127.0.0.1:1234");
ws.onopen = function (ev) {
ws.send('{"type":"login","uid":"I'm username","msg":"I'm logged in"}');
};
ws.onmessage = function (ev) {
if (ev.data){
console.log(ev.data)
}
};
// The following sentence can be sent multiple times, as a chat.
ws.send('{"type":"msg","uid":"I'm username","msg":"Hello"}');
クライアント側の効果。
サーバーの効果
https://www.yuanshuli.com/post-60.html より取得
golangで簡単なwebsocketチャットルームを実装してみたという記事です。golangのwebsocketチャットルームについては、Scripting Houseの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Go言語基本デザインパターン - 戦略パターン例解説
-
囲碁言語基本囲碁インターフェイス使用例詳細
-
Go言語 netパッケージ RPCリモートコール 3つの方法 httpとjson-rpcとtcp
-
golang 開発 マイクロフレームワーク Gin インストール テストと導入
-
囲碁言語の基本的なif条件文の使い方と例
-
初心者のための囲碁言語 ブラッシュアップ プリントアウト砂時計
-
Go言語 初心者のための7つのチュートリアル VI ネットワーク・プログラミング
-
Golangのリフレクションを使った構造体のエレガントなソート機能
-
golangでインターフェースオブジェクトを変換する2つの方法
-
golang exec シェル実行 出力の同期方法/実行結果の取得方法