Vue+express+Socketでチャット機能を実現

Vue+express+Socketでチャット機能を実現

この記事では、チャット機能を実現するためのVue+express+Socketの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

チャット機能の実装

特定の機能

インターフェースを美化せずに機能を実現するだけ

1. メッセージを入力し、「送信」をクリックします。すべてのユーザーが以下のメッセージを受信できます。

2. ユーザー ID を入力し、[接続] をクリックして対応するチャットに接続します。別のインターフェイスで、先ほどのページのユーザー ID を入力し、内容を入力して [指定の人に送信] をクリックします。すると、先ほどのページは印刷できますが、他のページは受信されず、プライベート チャットの機能が実現されます。

3.プライベートチャットのコンテンツ表示は特に実装されていませんが、メッセージの送受信は実装できます。プライベートチャットのコンテンツ表示を実装するには、別のプライベートチャットページを追加することができます。

スクリーンショット

プロジェクト準備

ソケットの準備のみ紹介されており、Vue や express の構築は紹介されていません。

フロントエンドソケット

インストール

npm i vue-socket.io --save

輸入

'vue-socket.io' から VueSocketIO をインポートします。

バックグラウンドソケット

インストール

npm i socket.io --save

輸入

express-generatorによって生成されたbin/wwwフォルダに追加します

var io = require('socket.io')(サーバー)'
io.on('接続', (ソケット) => {
  socket.on('地雷除去', (データ) => {
    コンソールにログ出力します。
  });
});

具体的なスクリーンショットは次のとおりです。

プロジェクトの実現

Vueコード

HTMLコード

<div class="home">
    ユーザーID: <input type="text" v-model="userid">
    ニックネーム: <input type="text" v-model="name">
    メッセージ: <input type="text" v-model="msg" />
    <button @click="send">送信</button>
    <button @click="join">接続</button>
    <button @click="sendmsg">指定した人に送信</button>

    <ul>
      <li v-for="(item,index) チャットリスト内" :key="item.name + index">
        {{ item.name }} はこう言っています: {{ item.msg }}
      </li>
    </ul>
</div>

jsコード

エクスポートデフォルト{
  名前: "ホーム",
  データ() {
    戻る {
      ユーザー: [],
      メッセージ: "",
      チャットリスト: [],
      名前: ''、
      ユーザーID: ''
    };
  },
  ソケット: {
    // バックグラウンドソケットに接続する
    接続する() {
      console.log('ソケットが接続されました');
    },
    // ユーザーのバックグラウンド呼び出し、データの追加 sendMessage(data) {
      コンソールにログ出力します。
      this.chatList.push(データ)
    },
    // ユーザーのバックグラウンド呼び出し、データの印刷receivemsg(data) {
      console.log('メッセージを受信');
      コンソールにログ出力します。
    }
  },
  メソッド: {
    // バックグラウンドにメッセージを送信する send() {
      // バックグラウンドソケットのメッセージメソッドを呼び出すには、emit を使用します。this.$socket.emit("message", {
        ユーザーID: 100,
        名前: this.name,
        メッセージ: this.msg
      });
    },
    // ユーザー接続を確立する join() {
      this.$socket.emit("join", {
        ユーザーID: this.userid
      });
    },
    // プライベートメッセージングのためにバックエンドにメッセージを送信する sendmsg() {
      this.$socket.emit("sendmsg", {
        ユーザーID: this.userid、
        メッセージ: this.msg
      });
    }
  }
};

エクスプレスコード

先ほどwwwファイルに定義された接続に次のコードを追加します。

// プライベートチャット機能を実装するために各ユーザーのソケットを保存するために使用します。let arrAllSocket = {}
// ソケット接続を作成する io.on('connection', (socket) => {
  console.log('接続されました');
  // コンソールログ(ソケット);
  // join関数はユーザーが接続するために使用されます socket.on('join', function (obj) {
    console.log(obj.userid + '参加')
    // プライベートメッセージングの各ユーザーの接続ステータスを保存します arrAllSocket[obj.userid] = socket
  })
  // フォアグラウンドから送信されたメッセージを受信する関数名は message です
  socket.on('メッセージ', (データ) => {
    コンソールにログ出力します。
    //メッセージをフロントデスクに送り返す(フロントデスクで定義されたメソッドを呼び出す)関数名はsendMessage
    io.emit('sendMessage', データ);
  });
  // プライベートメッセージ socket.on('sendmsg', function (data) {
    コンソールにログ出力します。
    // ユーザー接続を照会する let target = arrAllSocket[data.userid]
    if (ターゲット) {
      //指定された人にメッセージを送信する target.emit('receivemsg', data)
    }
  })
})

バックグラウンドコードのカプセル化

wwwファイルには多くのコードを含めるべきではないため、この部分のコードはカプセル化されています。

1. プロジェクトディレクトリに次の構造のioフォルダを作成します。

2. 前の部分のコードをio/index.jsに移動する

コードは次のとおりです

// server をパラメータとして渡す module.exports = function (server) {
  var io = require('socket.io')(サーバー);
// プライベートチャット機能を実装するために各ユーザーのソケットを保存するために使用します。let arrAllSocket = {}
// ソケット接続を作成する io.on('connection', (socket) => {
    console.log('接続されました');
    // コンソールログ(ソケット);
    // join関数はユーザーが接続するために使用されます socket.on('join', function (obj) {
      console.log(obj.userid + '参加')
      // プライベートメッセージングの各ユーザーの接続ステータスを保存します arrAllSocket[obj.userid] = socket
    })
    // フォアグラウンドから送信されたメッセージを受信する関数名は message です
    socket.on('メッセージ', (データ) => {
      コンソールにログ出力します。
      //メッセージをフロントデスクに送り返す(フロントデスクで定義されたメソッドを呼び出す)関数名はsendMessage
      io.emit('sendMessage', データ);
    });
    // プライベートメッセージ socket.on('sendmsg', function (data) {
      コンソールにログ出力します。
      // ユーザー接続を照会する let target = arrAllSocket[data.userid]
      if (ターゲット) {
        //指定された人にメッセージを送信する target.emit('receivemsg', data)
      }
    })
  })
}

最後に、wwwファイルで次のコードを使用してファイルを導入します。

var io = require('../io')
io(サーバー)

この時点で、チャットの基本的な機能が実現されます。後で使用するために記録します。

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

以下もご興味があるかもしれません:
  • Vueはチャットインターフェースを実装する
  • Vue が Web オンラインチャット機能を実現
  • Vue+ウェブ端末がWeChatウェブ版チャットルーム機能を模倣
  • Vue.js は WeChat チャットウィンドウを模倣してコンポーネント機能を表示します
  • Vue + socket.io はシンプルなチャットルームのサンプルコードを実装します
  • Vue2ベースのモバイルQQを模倣したシングルページアプリケーション機能(チャットボットへのアクセス)
  • RongCloud IM を使用して Vue Cli 3 プロジェクトにチャット機能を実装する方法
  • Vue で実装された WeChat ロボット チャット機能の例 [ソース コードのダウンロードあり]
  • Vue と Websocket をベースにした複数人用オンライン チャット ルーム
  • オンラインチャットを実現するVue+sshフレームワーク

<<:  MySQL 最適化戦略 (推奨)

>>:  Ubuntu 16.04にJenkinsをインストールするための詳細な手順

推薦する

Linux で SVN サーバーをインストールする方法

1. Yumのインストール yum でサブバージョンをインストール 2. 構成1. 倉庫を作る/ho...

MySQLのスローログの開き方と保存形式の詳細な分析

開発プロジェクトでは、MySQL のスロークエリログを通じて効率の問題のある SQL を監視できます...

実践的な経験を共有するためのコードチェックツールstylelintの紹介

目次序文文章1. stylelintをインストールする2. 設定ファイル3. stylelintを使...

js を使用して過去 1 週間、1 か月、3 か月の時間を取得する簡単な例

目次過去1週間の時間を取得する過去1か月の時間を取得する過去3か月分を取得新しい Date() と ...

さまざまな環境での Docker Compose のインストール方法

1. オンラインインストール現在、Linux x86アーキテクチャのオンラインインストールのみを試し...

MySQL実践ウィンドウ関数SQL分析クラスの生徒のテストの成績と生活費

目次1. 背景2. テーブル作成ステートメントとデータ挿入テーブルを作成するデータの挿入3. ウィン...

CSS3 を使用した SVG パス ストロークのアニメーション化入門チュートリアル

JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...

CSSインジェクションの知識の要約

最近のブラウザでは、CSS 内で JavaScript を実行することはできなくなりました。以前は、...

今日は、珍しいけれど役に立つJSテクニックをいくつか紹介します

1. 戻るボタンhistory.back() を使用してブラウザの「戻る」ボタンを作成します。 &l...

Dockerスペースがいっぱいでコンテナに入れない場合の解決策

トラブル発生が突然で、業務も迫っていたため、現場のスクリーンショットを撮る時間がありませんでしたので...

いくつかのMySQL更新操作のケース分析

目次ケーススタディアカウント残高を更新する直接更新楽観的ロック方式ロックフリーソリューションキューイ...

WindowsX Hyper-V ベースの CentOS システムをインストールする

現在、Linux を使用するほとんどの人は、クラウド サーバーを使用するか、Windows 上に仮想...

vue-element-adminフレームワークを使用して、バックエンドからメニュー機能を動的に取得します。

目次2. 詳しい説明2.1. asyncRoutesルーティングを追加する2.2. 新しいpermi...

WeChatアプレットがシンプルな計算機機能を実装

この記事では、WeChatアプレットの計算機機能を実装するための具体的なコードを参考までに紹介します...

React Router V6 のアップデート

目次ReactRouterV6 の変更1. <Switch> が <Routes&...