ホームページ > バックエンド開発 > Golang > Go 言語サーバー プログラミングの実践: 簡単な Web チャット ルームの構築

Go 言語サーバー プログラミングの実践: 簡単な Web チャット ルームの構築

WBOY
リリース: 2023-06-18 08:27:17
オリジナル
1808 人が閲覧しました

Go 言語はサーバー プログラミングの分野でますます広く使用されており、その高速性、効率性、同時実行機能が多くの人に選ばれる理由となっています。この記事では、リアルタイムのメッセージ送信、マルチユーザーのオンライン対話、その他の関連知識ポイントを含む、Go 言語で簡単な Web チャット ルームを構築する方法を紹介します。

1. Go 言語 Web フレームワークの選択

Go 言語では選択できる Web フレームワークが多数あり、その中でも人気のあるものは Beego、Gin、Echo などです。この記事では、Echo フレームワークを使用することを選択します。これは、Echo フレームワークが軽量で高性能で使いやすく、Web アプリケーションを迅速に構築するのに適しているためです。 Echo フレームワークを使用する前に、ターミナルを開いて次のコマンドを実行して依存関係パッケージを取得してください:

go get -u github.com/labstack/echo
ログイン後にコピー

2. 機能設計

この Web チャット ルームを構築する前に、そのチャット ルームを設計する必要があります。必要な機能 モジュールとプロセス:

  1. ユーザー認証を行うためのアカウントに登録およびログインします。
  2. チャット ルームのホームページには、オンライン ユーザーのリスト、チャット履歴の履歴などが表示されます。
  3. リアルタイムのメッセージ送信。マルチユーザーのオンライン対話をサポートします。
  4. ブラウザを閉じると、サーバーへの WebSocket 接続が切断され、ユーザーはオフラインとしてマークされます。

3. 実装手順

以下では、上記の機能モジュールとプロセスを段階的に実装します:

  1. アカウントに登録してログインします:

Go 言語では、サードパーティ パッケージ bcrypt を使用してパスワード暗号化を実装できます。最初にユーザー構造 User を作成し、次に gorm ライブラリを使用してデータベース テーブルを作成する必要があります。

type User struct {
    gorm.Model
    Username string `gorm:"unique;not null"`
    Password string `gorm:"not null"`
}
ログイン後にコピー

ユーザー登録とログインの処理関数コードは以下のとおりです。

// 用户注册
func Register(c echo.Context) error {
    username := c.FormValue("username")
    password := c.FormValue("password")
    confirmPwd := c.FormValue("confirm_pwd")
    u := &models.User{
        Username: username,
        Password: util.HashPwd(password),
    }
    if password != confirmPwd {
        return c.JSON(http.StatusOK, map[string]interface{}{
            "success": false,
            "message": "Passwords do not match",
        })
    }
    err := db.Create(&u).Error
    if err != nil {
        return c.JSON(http.StatusOK, map[string]interface{}{
            "success": false,
            "message": "Username already exists",
        })
    }
    return c.JSON(http.StatusOK, map[string]interface{}{
        "success": true,
        "message": "Register success",
    })
}

// 用户登录
func Login(c echo.Context) error {
    username := c.FormValue("username")
    password := c.FormValue("password")
    user := &models.User{}
    err := db.Where("username = ?", username).First(&user).Error
    if err != nil {
        return c.JSON(http.StatusOK, map[string]interface{}{
            "success": false,
            "message": "Username or password is incorrect",
        })
    }
    if util.CheckPwd(password, user.Password) {
        return c.JSON(http.StatusOK, map[string]interface{}{
            "success": true,
            "message": "Login success",
        })
    }
    return c.JSON(http.StatusOK, map[string]interface{}{
        "success": false,
        "message": "Username or password is incorrect",
    })
}
ログイン後にコピー
  1. チャット ルームのホームページ:

チャット ルームのホームページでは、オンラインでユーザーのリストとチャット履歴を表示する必要があります。オンライン ユーザー リストはマップに保存できます。キーはユーザー名、値は WebSocket 接続に関連する情報 (接続 ID、接続時間など) です。

// 在线用户列表
var clients = make(map[string]*Client)
ログイン後にコピー

履歴チャット レコードは、配列または Redis のようなデータ構造を使用して保存できます。以下はホームページ処理関数のコードです:

// 聊天室首页
func Room(c echo.Context) error {
    return c.Render(http.StatusOK, "room.html", map[string]interface{}{
        "clients": clients,
        "msgs":    msgs,
    })
}
ログイン後にコピー

このうち、room.html はテンプレート ファイル、clients と msgs はそれぞれオンライン ユーザー リストとチャット履歴記録です。

  1. リアルタイム メッセージ送信:

Echo フレームワークでは、WebSocket を使用して非常に簡単にリアルタイム メッセージ送信を実現できます。 WebSocket 処理関数を定義する必要があります。クライアントがサーバーに正常に接続すると、その情報はオンライン ユーザー リストに追加されます。クライアントがメッセージを送信すると、メッセージは接続されているすべてのクライアントに送信されます。

// WebSocket处理函数
func wsHandler(c echo.Context) error {
    // 建立WebSocket连接
    ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
    if err != nil {
        return err
    }
    defer ws.Close()

    // 获取用户名
    username, ok := c.QueryParams()["username"]
    if !ok {
        return errors.New("username is required")
    }

    // 添加用户
    client := &Client{
        WS:        ws,
        Username: username[0],
        ConnTime:  time.Now(),
    }
    clients[client.Username] = client

    // 遍历用户列表,发送欢迎消息
    for _, c := range clients {
        msg := &Message{
            Type: WelcomeMsg,
            Data: fmt.Sprintf("User '%s' joined the chat room", client.Username),
        }
        err = c.Send(msg)
        if err != nil {
            log.Println(err)
            continue
        }
    }

    // 接收消息,广播给所有用户
    for {
        msg := &Message{}
        err = client.Receive(msg)
        if err != nil {
            if err == io.EOF {
                delete(clients, client.Username)
                for _, c := range clients {
                    msg = &Message{
                        Type: LeaveMsg,
                        Data: fmt.Sprintf("User '%s' left the chat room", client.Username),
                    }
                    err = c.Send(msg)
                    if err != nil {
                        log.Println(err)
                        continue
                    }
                }
                break
            }
            log.Println(err)
            continue
        }
        for _, c := range clients {
            if c.Username == client.Username {
                continue
            }
            err = c.Send(msg)
            if err != nil {
                log.Println(err)
                continue
            }
        }
        msgs = append(msgs, *msg)
    }

    return nil
}
ログイン後にコピー
  1. WebSocket 接続を閉じるときは、サーバーから切断し、ユーザーをオフラインとしてマークします。 WebSocket 処理関数で defer ステートメントを使用すると、関数の終了時にオンライン ユーザー リストのユーザー情報を削除できます。
defer func() {
    delete(clients, client.Username)
}()
ログイン後にコピー

4. 概要

この記事では、Echo フレームワークと WebSocket を使用して、ユーザー認証、オンライン ユーザー リスト、履歴チャット レコード、実際のチャット レコードなどの単純な Web チャット ルームを実装します。時間メッセージ送信およびその他の機能。同時に、gorm ライブラリと bcrypt パッケージを使用して、ユーザー管理とパスワード暗号化機能も実装します。

実際には、メッセージ フィルタリングや機密ワード フィルタリングなどのセキュリティ問題も考慮する必要があります。この記事を通じて、読者が Go 言語を使用して Web アプリケーションを構築する方法、および一般的に使用されるライブラリとフレームワークを学ぶことができることを願っています。

以上がGo 言語サーバー プログラミングの実践: 簡単な Web チャット ルームの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート