SOcketを利用する.ioマルチチャットルームの実装(Nodejsベース)


socket.ioの概要
 Html5            ,   websocket,  websocket              ,       websocket   ,    ,       ,    websocket。     ,        websocket   。

http://blog.csdn.net/newpidian/article/details/50850670
この特性は、ブラウザ側とサーバ側のTCP接続に基づく双方向チャネルを提供する.しかし、すべてのブラウザがwebsocket特性をサポートするわけではないため、ブラウザ間の差異を平らにするために、開発者に統一的なインタフェースを提供するためにsocketが導入された.ioモジュール.Websoketをサポートしていないブラウザでは、socket.ioは、AJAX long polling、JSONP Pollingなど、他の通信方式に格下げすることができる.モジュールは新しいpackageをインストールします.jsonファイル、ファイルに次の内容を書きます.
{
  "name": "socketiochatroom",
  "version": "0.0.1",
  "dependencies": {
    "socket.io": "*",
    "express":"*"
  }
}
npm install 

この文を実行すると、nodeはnpmからsocketをダウンロードします.ioとexpressモジュール.
-
サーバ側の実装
フォルダにindexを追加します.jsファイルは、次のようにファイルに書き込まれます.
/**
 * Created by bamboo on 2016/3/31.
 */

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function (req, res) {
    "use strict";
    res.end("

socket server

"
) }); /* */ var onLineUsers = {}; /* */ var onLineCounts = 0; /*io , socket socket */ io.on('connection', function (socket) { console.log('a user connected'); /* */ socket.on('login', function (user) { "use strict"; // socket.name user.userId; socket.name = user.userId; /* */ if (!onLineUsers.hasOwnProperty(user.userId)) { // onLineUsers[user.userId] = user.userName; onLineCounts++; } /* , login socket , */ io.emit('login', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); console.log(user.userName, " ");// }); /* */ socket.on('disconnect', function () { "use strict"; if (onLineUsers.hasOwnProperty(socket.name)) { var user = {userId: socket.name, userName: onLineUsers[socket.name]}; delete onLineUsers[socket.name]; onLineCounts--; /* */ io.emit('logout', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); console.log(user.userName, " "); } }) /* , io , 。 , , , , emit , id */ socket.on('message', function (obj) { "use strict"; /* , */ io.emit('message', obj); console.log(obj.userName, " :", obj.content); }); }); /* 3000*/ http.listen(3000, function () { "use strict"; console.log('listening 3000'); });

サーバー・エンド・プログラムの実行
node index.js

しゅつりょく
listening 3000

ブラウザでlocalhost:3000を開くと、利用socket.io实现多人聊天室(基于Nodejs)_第1张图片という結果になります.
なぜなら,コードにはルーティングのみが以下のように設定されているからである.
app.get('/', function (req, res) {
    "use strict";
    res.end("

socket server

"
) });

サーバ側は主にsocketioサービスを提供しており,ルーティングは設定されていない.
クライアントの実装
クライアントにはjson 3のディレクトリとファイルが作成される.min.jsはネットからダウンロードできます.client - - - client.js - - - index.html - - - json3.min.js - - - style.css
indexでhtml内

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="format-detection" content="telephone=no"/>
    <meta name="format-detection" content="email=no"/>
    <title>1301  title>
    <link rel="stylesheet" type="text/css" href="./style.css"/>
    <script src="http://realtime.plhwin.com:3000/socket.io/socket.io.js">script>
    <script src="./json3.min.js">script>
head>
<body>
<div id="loginbox">
    <div style="width: 260px;margin: 200px auto;">
                  
        <br/>
        <br/>
        <input type="text" style="width:180px;" placeholder="      " id="userName" name="userName"/>
        <input type="button" style="width: 50px;" value="  " onclick="CHAT.userNameSubmit();"/>
    div>
div>

<div id="chatbox" style="display: none;">
    <div style="background: #3d3d3d;height: 28px;width: 100%;font-size: 12px">
        <div style="line-height: 28px;color:#fff;">
            <span style="text-align: left;margin-left: 10px;">1301  span>
            <span style="float: right;margin-right: 10px"><span id="showUserName">span>|
            <a href="javascript:;" onclick="CHAT.logout()" style="color: #fff;">  a>span>
        div>
    div>
    <div id="doc">
        <div id="chat">
            <div id="message" class="message">
                <div id="onLineCounts"
                     style="background: #EFEFF4; font-size: 12px;margin-top: 10px;margin-left: 10px;color: #666;">
                div>
            div>
            <div class="input-box">
                <div class="input">
                    <input type="text" maxlength="140" placeholder="       " id="content" name="content" >
                div>
                <div class="action">
                    <button type="button" id="mjr_send" onclick="CHAT.submit();">  button>
                div>
            div>
        div>
    div>
div>
<script type="text/javascript" src="./client.js">script>
body>
html>

クライアントでjs中
/**
 * Created by bamboo on 2016/3/31.
 */
 /*      */
(function () {
    "use strict";
    var d = document,
        w = window,
        dd = d.documentElement,
        db = d.body,
        dc = d.compatMode === "CSS1Compat",
        dx = dc ? dd : db,
        ec = encodeURIComponent,
        p = parseInt;
    w.CHAT = {
        msgObj: d.getElementById("message"),
        screenHeight: w.innerHeight ? w.innerHeight : dx.innerHeight,
        userName: null,
        userId: null,
        socket: null,
        /*         */
        scrollToBottom: function () {
            w.scrollTo(0, this.msgObj.clientHeight);
        },
        /*           ,        */
        logout: function () {
           // this.socket.disconnect();
            w.top.location.reload();
        },
        submit: function () {
            var content = d.getElementById('content').value;
            if (content != '') {
                var obj = {
                    userId: this.userId,
                    userName: this.userName,
                    content: content
                };
                //          ,                          。
                this.socket.emit('message', obj);
                d.getElementById('content').value = '';
            }
            return false;
        },
        /**             ID,          */
        genUid: function () {
            return new Date().getTime() + "" + Math.floor(Math.random() * 889 + 100);
        },
        /*      
                       ,      ,                         。*/
        updateSysMsg: function (o, action) {
            var onLineUsers = o.onLineUsers;
            var onLineCounts = o.onLineCounts;
            var user = o.user;
            //      
            var userHtml = '';
            var separator = '';
            for (var key in onLineUsers) {
                if (onLineUsers.hasOwnProperty(key)) {
                    userHtml += separator + onLineUsers[key];
                    separator = '、';
                }
            }
            //           
            d.getElementById('onLineCounts').innerHTML = '    ' + onLineCounts + "    : " + userHtml;

            //      
            var html = '';
            html += '
'; html += user.userName; html += (action === "login") ? " " : " "; html += '
'
; var section = d.createElement('section'); section.className = 'system J-mjrlinkWrap J-cutMsg'; section.innerHTML = html; this.msgObj.appendChild(section); this.scrollToBottom(); }, /* , loginbox , chatbox */ userNameSubmit: function () { var userName = d.getElementById('userName').value; if (userName != '') { d.getElementById('userName').value = ''; d.getElementById('loginbox').style.display = 'none'; d.getElementById('chatbox').style.display = 'block'; this.init(userName);// init } return false; }, // init: function (userName) { // uid this.userId = this.genUid(); this.userName = userName; d.getElementById('showUserName').innerHTML = this.userName;//[newpidian]|[ ] this.scrollToBottom(); // socketIO ,newpidian IP this.socket = io.connect('192.168.3.155:3000'); // this.socket.emit('login', {userId: this.userId, userName: this.userName}); // login, socket.emit('login ') , // io.emit('login', {onLineUsers: onLineUsers, onLineCounts: onLineCounts, user: user}); /* login , */ this.socket.on('login', function (o) { // CHAT.updateSysMsg(o, 'login'); }); /* logout , */ this.socket.on('logout', function (o) { CHAT.updateSysMsg(o, 'logout'); }); //var obj = { // userId: this.userId, // userName: this.userName, // content: content //}; /* */ this.socket.on("message", function (obj) { // var isMe = (obj.userId === CHAT.userId); var contentDiv = '
' + obj.content + '
'
; var userNameDiv = '' + obj.userName + ''; var section = d.createElement('section'); if (isMe) { section.className = 'user'; section.innerHTML = contentDiv + userNameDiv; } else { section.className = 'service'; section.innerHTML = userNameDiv + contentDiv; } CHAT.msgObj.appendChild(section); CHAT.scrollToBottom(); }); } } /* (keyCode) BackSpace 8 Esc 27 Right Arrow 39 -_ 189 Tab 9 Spacebar 32 Dw Arrow 40 .> 190 Clear 12 Page Up 33 Insert 45 /? 191 Enter 13 Page Down 34 Delete 46 `~ 192 Shift 16 End 35 Num Lock 144 [{ 219 Control 17 Home 36 ;: 186 \| 220 Alt 18 Left Arrow 37 =+ 187 ]} 221 Cape Lock 20 Up Arrow 38 ,< 188 '" 222 * */ // “ ” d.getElementById('userName').onkeydown = function (e) { console.log(e); e = e || event; if (e.keyCode === 13) { CHAT.userNameSubmit(); } }; // “ ” d.getElementById('content').onkeydown = function (e) { e = e || event; if (e.keyCode === 13) { CHAT.submit(); } }; })();

style.css
秘密
実行結果
サーバー側はすでに実行しており、クライアントも実行して次の図を示します.
利用socket.io实现多人聊天室(基于Nodejs)_第2张图片
newとpidianの2人のユーザーを追加し、情報を送信して終了し、次の結果を得ました.
利用socket.io实现多人聊天室(基于Nodejs)_第3张图片