ホームページ >ウェブフロントエンド >jsチュートリアル >ソケットを使用して Node.js_node.js でプライベートおよびパブリック チャット ルームを作成する

ソケットを使用して Node.js_node.js でプライベートおよびパブリック チャット ルームを作成する

WBOY
WBOYオリジナル
2016-05-16 15:31:051952ブラウズ

最初にレンダリングを示します:

前の記事では、Angular、Nodejs、socket.io を使用してチャット ルームと複数人チャット ルームを構築する方法を紹介しました この記事では、引き続き Node でのソケットの使用方法を紹介します。 js を使用してプライベートおよびパブリックのチャット ルームを作成します。具体的な詳細については、以下を参照してください。

nodejs のアプリケーションの中で、socket.io は、github 上で数万のスターを獲得しており、socket.io 全体の使用を容易にするために、その成功に劣るものではありません。 🎜>

例としては、

http://chat.lovewebgames.com/

をクリックしてください。 ソース コードのダウンロード

https://github.com/tianxiangbing/chat

貧乏なのでサーバーもデータベースも全て海外から無料で使用しており、アクセス速度は若干遅いかもしれません。

まず、socket.io についての私の理解を話させてください。Websocket は、過去の通信を監視するためにポート サービスを開くことに似ています。したがって、現在のサイトのポート 80 を使用してソケット サービスを開始することも、次のような他のポートにソケット サービスを配置することもできます。

コードをコピーします コードは次のとおりです: require('socket.io').listen(3000);


これはポート 3000 を監視するためです。私が使用している無料サーバーには他のポートを開く権限がないため、引き続き 80 を使用します。80 はすでに Express で使用されているため、Express を使用するときにそれを渡す必要があります。

コードをコピーします コードは次のとおりです: var サーバー = http.createServer(app);
var ソケット = require(‘./socket/msg’)(サーバー);



次に、これを msg.js で書きました

コードをコピーします コードは次のとおりです: var db = require('../db/mysql');
var sio = require('socket.io');
var IO = 関数(サーバー) {
var io = sio.listen(サーバー)



これは調和しています。db は mysql 接続を作成するメソッドですが、このセクションには含まれないため省略します。
これは、socket.io での動作です。まず、io チャネルへの接続を作成し、Nodejs 内のソケットのイベントをイベント駆動型で監視します。コードは次のとおりです:

コードをコピーします コードは次のとおりです: io.on('接続', function(socket) {
console.log('ユーザーが接続しました。');
socket.on('切断', function() {
console.log('ユーザーが切断されました。');
});
})



この時点でユーザーが接続している限り、接続に入ります。パブリック チャットの場合、そのパラメーターはソケットです。

コードをコピーします コードは次のとおりです: io.emit('チャットメッセージ', {});


これがフォームです。ただし、ここではプライベート チャットを行っているため、プライベート チャットしている相手がそれを使用してソケットを見つけられるように、このソケット オブジェクトをグローバル ワールドに一時的に保存する必要があります。これは実際、非常に複雑です。ここでのチャットは完全なポイントツーポイントではありませんが、メッセージはサーバーを通過し、サーバーはメッセージを伝えたい相手のソケット オブジェクトを見つけて送信します。これがプロセス全体です。ここでは、配列のようなオブジェクトを使用してそれを保存します。

コードをコピーします コードは次のとおりです: var users = {},
usocket = {};
socket.on('ユーザー参加', function(data) {
users[ユーザー名] = ユーザー名;
usocket[ユーザー名] = ソケット;
})

ログインするにはユーザー名が必要なので、ユーザー名を唯一の識別子として使用します (これは単なる例です。ここで配列のような形式を使用する利点は次のとおりです)。ループする必要もありません。 A にプライベート メッセージを送信するときは、まずこの uscoket でメッセージを見つけてから、そのメッセージの出力を呼び出します。

function sendUserMsg(data) {
 if (data.to in usocket) {
 console.log('================')
 console.log('to' + data.to, data);
 usocket[data.to].emit('to' + data.to, data);
 usocket[data.user].emit('to' + data.user, data);
 console.log('================')
 }
}

ここで2回発信しているのは、相手にメッセージを送るときに自分もメッセージを受信して​​表示する必要があるからです。まず、インターフェースが統一されており、チャット内のすべてのコンテンツがサーバーから取得されます。第 2 に、チャットが正常に送信されたことが証明されます。

その後、クライアントでリッスンしているときに、自分のユーザー名を使用して、そのユーザー名のイベント リスナーをセットアップしました。

socket.on('to' + user, function(data) {
 //console.log(data);
 formatMsg(data);
})

このようにして、私が送信したメッセージでも受信したメッセージでも、このイベントに入ります。最後に、ユーザーが離れるときにオブジェクトを削除することを忘れないでください。

socket.on('disconnect', function() {
 console.log('disconnect')
 if (username) {
 counter--;
 delete users[username];
 delete usocket[username];
 if (home.name == username) {
  homeLeave(username);
 }
 sendmsg({
  type: 0,
  msg: "用户<b>" + username + "</b>离开聊天室",
  counter: counter,
  users: users
 })
 }
});

はい、完了です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。