複数人チャットルームを実現する js コード

複数人チャットルームを実現する js コード

この記事の例では、多人数チャットルームを実装するためのjsコードの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

設計要件:

1) ユーザーは登録してチャットルームにログインする必要があります
2) チャットルームにはオンラインユーザー全員を表示できる
3) 各チャットコンテンツの前に、そのチャットコンテンツを送信したユーザー名が表示されます。
4) プライベートチャットが利用可能です。
5) ユーザーがチャットルームに出入りすると、システムはチャットルームで放送します。

config.jsコードは以下のとおりです

モジュール.エクスポート={
    "ポート":3000,
    "ホスト":"127.0.0.1"
}

Broadcast.jsのコードは以下のとおりです

exports.broadcast = 関数 (データ、ユーザー) {
    var from =データ.from;
    var メッセージ = data.message;
    message = from+"say: "+メッセージ;
    //メッセージを構築する var send = {
        mstype:"ブロードキャスト",
        メッセージ:メッセージ
    };
    send = 新しいバッファ(JSON.stringify(send));
    // ユーザーグループ内のすべてのユーザー、送信側のすべてのユーザーを走査します for(var username in users){
        if(ユーザー名!=from){
            users[ユーザー名].write(send);
        }
    }
};

Signup.jsコードは次のとおりです

exports.signup = 関数 (ソケット、データ、ユーザー) {
//登録ユーザーのユーザー名を取得します。var username=data.username;
    if(!users[username]){ //存在しない場合は、ユーザー名とソケットを保存します
        users[ユーザー名]=ソケット;
        var 送信 = {
            mstype:"サインアップ",
            コード:1000、
            ユーザー名:ユーザー名、
            メッセージ: 「登録が完了しました」
        };
        socket.write(JSON.stringify(send));
    }その他{//cunzai
        var 送信 = {
            mstype:"サインアップ",
            コード:1001、
            メッセージ: 「ユーザー名はすでに使用されています。ユーザー名を再入力してください」
        }
        socket.write(JSON.stringify(send));
    }
};

p2p.jsコードは以下のとおりです

exports.p2p = 関数 (ソケット、データ、ユーザー) {
    var from =データ.from;
    var to = data.to;
    var メッセージ = data.message;
    var 受信者=users[to];
    if(!receiver){//受信者が存在しないvar send={
          mstype:"p2p",
          コード:2001、
          メッセージ: 「ユーザー」+to+「存在しません」
      }
      socket.write(JSON.stringify(send));
    }それ以外{
        //存在する場合は、受信者に情報を送信します var send={
            mstype:"p2p",
            コード:2000、
            から:から、
            メッセージ:from+"to you"+メッセージ
        }
        受信者.write(JSON.stringify(send));
    }
};

サーバーコード

//p2p チャットルームサーバー var net=require("net");
var config = require("./config");
var ブロードキャスト = require("./broadcast");
var p2p = require("./p2p");
var signup = require("./signup");
var ユーザー = {};
var server=net.createServer();
server.on ("接続", 関数 (ソケット) {
    socket.on("データ",関数(データ) {
        データ = JSON.parse(データ);
        スイッチ (data.mstype) {
            ケース「サインアップ」:
                signup.signup(ソケット、データ、ユーザー);
                壊す;
            「ブロードキャスト」の場合:
                ブロードキャスト。ブロードキャスト(データ、ユーザー);
                壊す;
            ケース「p2p」:
                p2p.p2p(ソケット、データ、ユーザー);
                壊す;
            デフォルト:
                壊す;
        }
    });
    socket.on("エラー",関数() {
        console.log("クライアントが異常終了しました");
    });
});
server.listen(config.port,config.host,function() {
    console.log("サーバーはポート"+config.port+"でリッスンを開始します");
});

クライアントのコードは次のとおりです。

var net = require("net");
var config = require("./config");
var クライアント = net.createConnection({
    ポート:config.port、
    ホスト:config.host
});
var ユーザー名;
クライアント.on("接続",関数() {
    console.log("ユーザー名を入力してください:");
    process.stdin.on("データ",関数(データ){
        データ=data.toString().trim();
        // ユーザーがすでに存在するかどうかを確認します if(!username){
            var 送信 = {
                mstype:"サインアップ",
                ユーザー名:データ
            };
            Client.write(JSON.stringify(send));
            戻る;
        }
        var regex=/(.{1,18}):(.+)/;
        var matches = regex = regex.exec(data);
        if(一致する){
            //一致した場合はP2Pです
            var from=username;//送信者はあなた自身です var to=matches[1];//誰に送信されたか var message=matches[2];
            //JSON形式の情報を構築 var send={
                mstype: "p2p",
                差出人:ユーザー名、
                に:に、
                メッセージ:メッセージ
            };
            Client.write(JSON.stringify(send));
        }それ以外{
            //ブロードキャスト var send = {
                mstype:"ブロードキャスト",
                差出人:ユーザー名、
                メッセージ:データ
            };
            Client.write(JSON.stringify(send));
        }
    });
});
Client.on("データ",関数(データ) {
    データ = JSON.parse(データ);
    スイッチ (data.mstype) {
        ケース「サインアップ」:
            var code=データ.code;
            スイッチ(コード){
                ケース1000:
                    ユーザー名=data.ユーザー名;
                    console.log(データ.メッセージ);
                    壊す;
                ケース1001:
                    console.log(データ.メッセージ);
                    壊す;
                デフォルト:
                    壊す;
            }
            壊す;
        「ブロードキャスト」の場合:
            console.log(データ.メッセージ);
            壊す;
        ケース「p2p」:
            var code=データ.code;
            スイッチ(コード){
                ケース2000:
                    console.log(データ.メッセージ);
                    壊す;
                ケース2001:
                    console.log(データ.メッセージ);
                    壊す;
                デフォルト:
                    壊す;
            }
            壊す;
        デフォルト:
            壊す;
    }
});
Client.on("エラー",関数() {
    console.log("チャットルームは閉鎖されました!!");
})

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Node.jsで実装されたシンプルなチャットルーム機能共有
  • Angular、Nodejs、socket.io を使用してチャットルームや複数人用チャットルームを構築します
  • jsを使用して簡単なチャットルーム機能を書く
  • AngularJS+Node.js でオンラインチャットルームを実装する
  • Ajax PHP JavaScript MySQL でシンプルな非リフレッシュオンラインチャットルームを実現
  • JavaScript がチャットルームのチャット記録を模倣する
  • JavaScript でシンプルなチャットルームを実装する
  • Nodejs はマルチルームのシンプルなチャットルーム機能を実現します
  • NodeJSはチャットルーム機能を実装します
  • Node.js でソケットを使用してプライベートおよびパブリック チャット ルームを作成する

<<:  CSSを使用してファイルアップロードパターンを描画する

>>:  Nginx レイヤー 4 負荷分散構成ガイド

推薦する

RedHat 6.5/CentOS 6.5 に MySQL 5.7.20 をインストールするための詳細なチュートリアル

rpmインストールパッケージをダウンロードするMySQL公式サイト: https://dev.mys...

MySQLの場合の使用例分析

まず、データベース テーブルを作成します。 テーブル `t_demo` を作成します ( `id` ...

MySQL 5.7 でパスワードを忘れた場合の解決方法の詳細な説明

環境: [root@centos7 ~]# uname -r 3.10.0-514.el7.x86_...

MySQL 8.0.15 圧縮版インストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.15圧縮版のインストール方法を紹介します。具体的な内容は...

ボタンのタイプが送信として指定されていません。ボタンをクリックしても、指定された URL にジャンプしません。

現在、プロジェクトの要件により、フォームの送信を制御し、送信前にデータを検証および処理するために j...

JavaScript デザインパターン 責任連鎖パターン

目次概要コードの実装パラメータ定義成し遂げる責任連鎖パターンの実装改善概要責任チェーン パターンは、...

Dockerボリューム権限管理の詳細な説明

ボリュームデータボリュームは Docker の重要な概念です。データ ボリュームは、1 つ以上のコン...

Centos8 で yum を使用して rabbitmq をインストールするチュートリアル

/etc/yum.repos.d/フォルダに入るrabbitmq-erlang.repo ファイルを...

1つのコマンドで、シェルの読み取りコマンドの共通パラメータを理解できます。

Shell で受信パラメータを受信する方法は 2 つあることがわかっています。 1 つはスクリプト...

Centos7 システムでの .NET Core 2.0 + Nginx + Supervisor 環境の構築

1. Linux .NET Core の紹介Microsoft は常に自社のプラットフォームに対して...

MySQL データベースの 1045 エラーの解決方法

ローカル データベースがサーバー データベースに接続されているときに発生する 1045 の問題を解決...

MySQL の count()、group by、order by の詳細な説明

最近、IM を実行するときに、これらの 3 つのキーワードを同時に使用したときに問題が発生しました。...

HTML で #include ファイルを使用する例

a.htmとb.htmの2つのファイルがあります。同じディレクトリ内のa.htmの内容は次のとおりで...

JS 矢印関数に適さないシナリオは何ですか?

目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...