node 练习之多人聊天、点对点聊天室demo

server端

var net = require('net');
var path = require('path');

var server = net.createServer();

var users = {};
server.on('connection', function (socket) {
    socket.on('data', function (data) {
        data = JSON.parse(data.toString());
        switch (data.prototype) {
            case 'register':
                if (users[data.username]) {
                    var send = {
                        prototype:'register',
                        code: 1001
                    }
                    socket.write(JSON.stringify(send))
                } else {
                    users[data.username] = socket;
                    var send = {
                        prototype:'register',
                        username: data.username,
                        code: 1000
                    };
                    socket.write(JSON.stringify(send))
                }
                break;
            case 'p2p':
                if (users[data.to]) {
                    var send={
                        prototype:'p2p',
                        from:data.from,
                        message:data.message
                    };
                   users[data.to].write(JSON.stringify(send));
                } else {
                    var send={
                        prototype:'public',
                        from:data.from,
                        message:data.message
                    };
                    for(var k in users){
                        users[k].write(JSON.stringify(send))
                    }
                }
                break;
            case 'public':
                var send = {
                    prototype:'public',
                    from: data.from,
                    message:data.message
                };
                for(var k in users){
                    users[k].write(JSON.stringify(send))
                }
                break;
            default:
                ;
        }
    });
    socket.on('error', function (err) {
        console.log('有客户端退出',err);
    })
});
server.listen(3000, function () {
    console.log('服务器开启成功');
});

client端

var net=require('net');
var path=require('path');

var client=net.createConnection({
    port:3000
});
var username;
client.on('connect',function (){
    console.log('请输用户名');
    process.stdin.on('data',function (data){
        data=data.toString().trim();
        if(!username){
            var send={
                prototype:'register',
                username:data
            };
            client.write(JSON.stringify(send))
        } else {
            var regex = /(.{1,18}):(.+)/;
            var matches=regex.exec(data);
            if(matches){
                var from=username;
                var to=matches[1];
                var message=matches[2];
                var send={
                    prototype:'p2p',
                    from:from,
                    to:to,
                    message:message
                };
                client.write(JSON.stringify(send))
            } else {
                var from = username;
                var message=data;
                var send={
                    prototype :'public',
                    from:from,
                    message:message
                };
                client.write(JSON.stringify(send))
            }
        }

    })
});
client.on('data',function (data){
        data=JSON.parse(data.toString());
        switch (data.prototype){
            case 'register':
                if(data.code=='1000'){
                    console.log('注册成功');
                    username=data.username;
                } else if(data.code=='1001'){
                    console.log('用户名已存在');
                }
                break;
            case 'public':
                console.log(data.from+':'+data.message);
                break;
            case 'p2p':
                console.log(data.from+'对你说:'+data.message);
                break;
            default:;
        }
});

转载于:https://my.oschina.net/pengpengpengone/blog/733834

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值