NodeJS实现Websocket聊天室

debug("\n**************************");
var Config = {
    portSocket: 5050
};
var websocket = require("nodejs-websocket"),
crypto = require('crypto'),
http = require('http');
var webSocketServer = websocket.createServer(function(conn) {
    if (!login(conn.path)) {
        conn.close();
    }
    conn.on("close",
    function(code, reason) {
        debug("客户端连接失败(用户断开)");
    });
    conn.on("error",
    function(code, reason) {
        debug("客户端连接失败(用户断开)");
    });
    conn.on("text",
    function(msg) {
        try {
            var msgObj = JSON.parse(msg);
            var account = msgObj.account;
            var channel = msgObj.channel;
            var ticket = msgObj.ticket;

            if (sha1("account" + account + "channel" + channel) !== ticket) {
                debug("用户身份验证失败");
            } else {
                switch (msgObj.type) {
                case 'system':
                    webSocketServer.connections.forEach(function(conn) {
                        conn.sendText(msgObj.msg);
                    });
                    break;
                case 'channel':
                    webSocketServer.connections.forEach(function(conn) {
                        var query = new QueryString(conn.path);
                        if (query.channel == msgObj.to) {
                            conn.sendText(msgObj.msg);
                        }
                    });
                    break;
                case 'chat':
                    webSocketServer.connections.forEach(function(conn) {
                        var query = new QueryString(conn.path);
                        if (query.account == msgObj.to) {
                            conn.sendText(msgObj.msg);
                        }
                    });
                    break;
                default:
                    debug("未知的消息类型" + msgObj.type);
                    return;
                }
            }
            //debug(msg);
        } catch(e) {
            debug("消息类型解析失败");
            return;
        }
    });
});
webSocketServer.listen(Config.portSocket);
debug("服务启动成功(" + Config.portSocket.toString() + ")Websocket");
checkConnection();

var httpServer = http.createServer(function(req, res) {
    res.writeHead(200, {
        'Content-Type': 'text/plain;charset=utf-8'
    });
    if (req.method.toUpperCase() == 'POST') {
        var postData = "";
        req.on("data", function(data) {
            postData += data;
        });
        req.on("end", function() {
            debug("收到HTTP请求(POST)");
            var msgObj = JSON.parse(postData);
            if (sha1("to-" + msgObj.to + "-type-" + msgObj.type + "-content-" + msgObj.content) == msgObj.ticket || true) {
                switch (msgObj.type) {
                    case 'user':
                        try{
                            webSocketServer.connections.forEach(function(conn) {
                                var query = new QueryString(conn.path);
                                if (query.uid == msgObj.to) {
                                    conn.sendText(msgObj.content);
                                }
                            });
                            debug("单聊消息发送成功");
                        }catch(e){
                            debug("异常");
                        }
                        res.end("Send OK");
                        break;
                    case 'channel':
                        try{
                            webSocketServer.connections.forEach(function(conn) {
                                var query = new QueryString(conn.path);
                                if (query.channel == msgObj.to) {
                                    conn.sendText(msgObj.content);
                                }
                            });
                            debug("频道消息发送成功");
                        }catch(e){
                            debug("异常");
                        }
                        res.end("Send OK");
                        break;
                    case 'system':
                        try{
                            webSocketServer.connections.forEach(function(conn) {
                                //console.log(conn);return;
                                conn.sendText(msgObj.content);
                            });
                            debug("系统消息发送成功");
                        }catch(e){
                            debug("异常");
                        }
                        res.end("Send OK");
                        break;
                    default:
                        debug("系统消息发送失败(Type Error)");
                        res.end("Type Error");
                }
            } else {
                debug("系统消息发送失败(Ticket Error)");
                res.end("Ticket Error");
            }
        });
    } else if (req.method.toUpperCase() == 'GET') {
        res.end("Hamm's Websocket Server.");
    } else {
        res.end("Hamm's Websocket Server.");
    }
});
httpServer.listen(Config.portHttp);
debug("服务启动成功(" + Config.portHttp.toString() + ")HTTP");


function checkConnection() {
    setTimeout(function() {
        debug("当前在线连接数:(" + webSocketServer.connections.length + ")");
        checkConnection();
    },
    10000);
}

function getTime() {
    var now = new Date();
    var hours = now.getHours();
    var minutes = now.getMinutes();
    var seconds = now.getSeconds();
    if (hours < 10) {
        hours = "0" + hours;
    }
    if (minutes < 10) {
        minutes = "0" + minutes;
    }
    if (seconds < 10) {
        seconds = "0" + seconds;
    }
    return hours + ":" + minutes + ":" + seconds;
}

function debug(message) {
    console.log(message);
}

function login(url) {
    var query = new QueryString(url);
    if (sha1("account" + query.account + "channel" + query.channel) == query.ticket) {
        debug("客户端连接成功 "+query.account);
        return true;
    } else {
        debug("客户端连接失败:登录失败)");
        return false;
    }
}

function QueryString(url) {
    var name, value;
    url = url.replace("/?", "");
    var arr = url.split("&"); //各个参数放到数组里
    for (var i = 0; i < arr.length; i++) {
        num = arr[i].indexOf("=");
        if (num > 0) {
            name = arr[i].substring(0, num);
            value = arr[i].substr(num + 1);
            this[name] = value;
        }
    }
}

function sha1(str) {
    var sha1 = crypto.createHash("sha1"); //定义加密方式:md5不可逆,此处的md5可以换成任意hash加密的方法名称;
    sha1.update(str);
    var res = sha1.digest("hex"); //加密后的值d
    return res;
}