web socket io 聊天系统 简易demo

2017-02-24 00:00:00 by 【6yang】, 461 visits, 收藏 | 返回
package.josn node安装包 ,运行npm install

{
  "name": "websocket",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.14.1",
    "socket.io": "^1.7.3"
  }
}



服务端代码: 
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res) {
    res.send('<h1>Welcome Realtime Server1</h1>');
});

//在线用户
var onlineUsers = {};
var onlineCount = 0;
io.on('connection', function(socket) {
    console.log('a user connected');
    //登录用户
    socket.on('login', function(obj) {
        //将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
        socket.name = obj.userid;

        //检查在线列表,如果不在里面就加入
        if (!onlineUsers.hasOwnProperty(obj.userid)) {
            onlineUsers[obj.userid] = obj.username;
            //在线人数+1
            onlineCount++;
        }

        //向所有客户端广播用户加入
        io.emit('login', {
            onlineUsers: onlineUsers,
            onlineCount: onlineCount,
            //user: obj
        });

        //fn('a') ;
        console.log(obj.username + '加入了聊天室');
    });
    //logout用户
    socket.on('logout', function(obj) {
        //将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
        
    });
    //监听用户退出
    socket.on('disconnect', function(){
        //将退出的用户从在线列表中删除
        if(onlineUsers.hasOwnProperty(socket.name)) {
            //退出用户的信息
            var obj = {userid:socket.name, username:onlineUsers[socket.name]};
            
            //删除
            delete onlineUsers[socket.name];
            //在线人数-1
            onlineCount--;
            
            //向所有客户端广播用户退出
            io.emit('logout', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
            console.log(obj.username+'退出了聊天室');
        }
    });

    socket.on("message", function(obj) {
        io.emit("message", obj);
        console.log(obj.username+'说:'+obj.content);
    });
});

http.listen(3000, function() {
    console.log('listening on *:3000');
});

原码:html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://127.0.0.1:3000/socket.io/socket.io.js"></script>
    <script src="js/jquery-1.10.1.min.js"></script>
</head>
<style>
    *{
        padding: 0;
        margin: 0;
    }
    body{
        padding: 15px;
    }
    .username_form{
        padding: 15px 0
    }
    .input{
        border:0 none;
        padding: 15px 2px;
    }
    .input01{
        border-bottom: 1px solid #ccc;
    }
    input.input02{
        border: 1px solid #ccc;
    }
    .t-username{
        color: #f30;
        border-bottom: 1px solid #f30
    }
</style>
<body>
<form action="" id="form_username" class="username_form">
    <input type="text" id="username" class="input input01" name="username"  style="width: 200px;" value="" placeholder="请先输入你在聊天室的昵称 " />
    <input type="submit" class="submit"  value="submit"/>
</form>
<ul id="message1"></ul>
<form action="" id="form">
    <input type="text" name="content"  class="input input01" value="" placeholder="你太懒了,说两句吧" />
    <input type="submit" id="submit"  value="submit"/>
</form>
<script>
    var socket = io.connect('ws://127.0.0.1:3000');
    function userBrowser() {
        var browserName = navigator.userAgent.toLowerCase();
        if (/msie/i.test(browserName) && !/opera/.test(browserName)) {
            return 'IE';
        } else if (/firefox/i.test(browserName)) {
            return 'Firefox';
        } else if (/chrome/i.test(browserName) && /webkit/i.test(browserName) && /mozilla/i.test(browserName)) {
            return 'Chrome';
        } else if (/opera/i.test(browserName)) {
            return 'Opera';
        } else if (/webkit/i.test(browserName) && !(/chrome/i.test(browserName) && /webkit/i.test(browserName) && /mozilla/i.test(browserName))) {
            return 'Safari';
        } else {
            return 'unkown'
        }
    }
    var getRandomColor = function(){   
      return  '#' +   
        (function(color){   
        return (color +=  '0123456789abcdef'[Math.floor(Math.random()*16)])   
          && (color.length == 6) ?  color : arguments.callee(color);   
      })('');   
    };

    $(function() {
        var ws = {
            username:null,
            userid:null,
            socket:null,
            getusername_color: null,
            logout:function(){
                //this.socket.disconnect();
                location.reload();
            },
        };

        var form = $('#form');
        //关键点是这里: scoket on 对应的action 接收处理;
        socket.on("message", function(obj) {
            //document.querySelector("#message").innerHTML = obj.msg;
            $('#message1').append('<li>' + obj.msg + '</li>');
        });

        ws.getusername_color = getRandomColor();
        var currbrower = navigator.userAgent;
        form.on('click', '#submit', function(e) {
            e.preventDefault();
            if(ws.userid == null) {
                alert('请先添加用户名')
                return;
            }
            var self = $(this),
                msg = self.prev().val()
                /*var obj = {
                    userid: this.userid,
                    username: this.username,
                    content: content
                };*/
            socket.emit("message", {
                "name": 'test',
                "msg": '<span style=color:'+ws.getusername_color+'>' + ws.username + ' say</span>: ' + msg
            });

            self.prev().val('');
        })    

        $('#form_username')
            .on('click', '#logout', function(){
                socket.on('logout', function(o){
                    alert('退出')
                });
                ws.logout();
            })
            .on('click', '.submit', function(e) {

            e.preventDefault();
            var self = $(this),
                name = self.prev().val(),
                userid = new Date().getTime()+""+Math.floor(Math.random()*899+100);
            if(name == '') {
                alert('请先添加用户名')
                return;
            }
            ws.username = name;
            ws.userid = userid;

            
            //告诉服务器端有用户登录
            socket.emit('login', {userid:userid, username:username});
            
            //监听新用户登录
            socket.on('login', function(o){
                self.closest('form').html('当前用户名:<span class="t-username">' + name + '</span> <a href="javascript:;" id="logout">退出</a></span> 当前共有 '+o.onlineCount+' 人在线,在线列表');
            });
            
        })    
    });



    </script>
</body>
</html>
分享到:
share

    图片原图

    loading

    loading