夕方で、何もすることはありませんでした... Socket.IOでチャットの例を解析し、特別なトリックなしでチャットをプライベートにする可能性に興味がありました。 アイデアは新しいものではなく、十分に単純です-あなたは性別と年齢を選択し、対話者の希望の性別と年齢を示して、行きましょう! 一種のルーレット。
それでは、要件から始めましょう:
- エントリーフォーム-性別と年齢の表示(自分自身と対話者の両方);
- プライベートルームを作成する機能(適切な対話者がいない場合);
- 個室への接続(対話者がいる場合);
- 匿名性(ユーザーデータは保存しません)。
何が必要ですか?
Node.JS(執筆時点-0.6.14)、express、socket.ioモジュール。 さらに、nib、スタイラス、i18n、utilが使用されます。
行きましょう。
新しいユーザーを接続する
ここではすべてが非常に簡単です。 ユーザーオブジェクトを作成し、カウンターをインクリメントし、クライアントの数を更新します。
var user = {}; var uid = socket.store.id; var room_id = uid + "_room"; online++; total++; socket.broadcast.emit('online', total, free); socket.emit('online', total, free); user.id = socket.store.id; users[socket.store.id] = user;
ユーザーログイン
エントリとは、初期フォームで必要なパラメータを選択した後、チャット自体への入り口を意味します。
対談者の選択メカニズム自体は、単純なサイクルとして実装されます(高負荷でどのくらい速く動作するかわかりません)。 入力されたパラメーターを確認して比較し、一致する場合は別のユーザーへの接続を開始するか、そのままにしておきます。
socket.on('nickname', function (nick, m_sex, m_age, c_sex, c_age, fn) { if (nicknames[socket.user_id]) { fn(true); } else { fn(false); nicknames[socket.store.id] = socket.nickname = socket.store.id; socket.user_id = socket.store.id; socket.gender = m_sex; var user = users[socket.store.id]; user.m_sex = m_sex; user.m_age = m_age; user.c_sex = c_sex; user.c_age = c_age; user.active = 0; free++; // Check existing rooms for(var __room in rooms){ if(user.active == 0){ _room = rooms[__room]; if(_room.c_sex == m_sex && _room.c_age == m_age && _room.m_sex == c_sex && _room.m_age == c_age && _room.active == 0){ room_id = _room.id; _room.active = 1; _room.nicknames[socket.user_id] = socket.user_id; user.active = 1 free--; console.log(' room finded! this - ' + room_id); } } } // Create own room if(user.active == 0){ console.log(' no room finded :( create own - ' + room_id); var room = {}; room.id = room_id; room.m_sex = m_sex; room.m_age = m_age; room.c_sex = c_sex; room.c_age = c_age; room.active = 0 room.nicknames = {}; room.nicknames[socket.user_id] = socket.user_id; rooms[room_id] = room; socket.emit("user message", "System", i18n.__("waiting")); } users[socket.store.id] = user; socket.join(room_id); socket.broadcast.to(room_id).emit('announcement', socket.user_id + ' ' + i18n.__('connected')); socket.broadcast.to(room_id).emit('nicknames', rooms[room_id].nicknames); socket.emit('nicknames', rooms[room_id].nicknames); } });
残っている唯一のことは、実際にユーザーが互いに通信できるようにすることです。
メッセージを送信する
socket.on('user message', function (msg) { msg = sanitize(msg).entityEncode(); console.log(' message from ' + socket.user_id + ' to room ' + room_id + ": " + msg); socket.broadcast.to(room_id).emit('user message', socket.gender == 1 ? i18n.__("he") : i18n.__("she") , msg); });
まあ、実際に...
出口
socket.on('disconnect', function () { online--; total--; socket.broadcast.emit('online', total, free); if (!socket.user_id) return; if(free > 0) free--; socket.broadcast.emit('online', total, free); console.log(socket.user_id); socket.leave(room_id); socket.broadcast.to(room_id).emit('announcement', socket.user_id + ' ' + i18n.__('disconnected')); if(rooms[room_id]) delete rooms[room_id].nicknames[socket.user_id]; if(rooms[room_id]) socket.broadcast.to(room_id).emit('nicknames', rooms[room_id].nicknames); delete users[socket.user_id]; delete nicknames[socket.user_id]; delete rooms[room_id]; });
それだけです それは10人未満の負荷の下でテストされ、問題はありませんでした:)コミュニティがそのようなチャットのプロジェクトに興味を持っているなら-今日私はgithubに投稿します、それはただ楽しみのために行われました。
PSトピックは長い間書かれ始め、ドラフトのコピーから転送されました-したがって、指定された製品のバージョンは関係ない場合があります。
PSSここでライブを見ることができます-virt.in
UPD。 約束のソースコードはこちら-github.com/eudj1n/virtin