Node.js学习之TCP聊天程序

创建一个基本的TCP服务器,任何人都可以连接到该服务器,无需实现任何协议或者指令:
1、成功连接到服务器后,服务器会显示欢迎信息,并要求输入用户。同时显示当前有多少个其他客户端已经连接。
2、输入用户名,回车,确认连接。
3、连接好后,输入信息回车,将信息向其他客户端发送。

首先创建项目目录:tcp-chat
在tcp-chat文件夹中,创建package.json文件

{
 "name" : "tcp-chat",
 "version" : "0.0.1",
 "description" : "Our first Tcp Server"
}

创建index.js文件

/* 模块依赖 */
var net = require('net');

/* 追踪用户连接数 */
var count = 0;

/* 定义用户 */
var users = {};

/* 创建服务器 */
var server = net.createServer(function(conn) {
    // 处理连接
    console.log('\033[90m net connection! \033[39m');

    // 处理编码
    conn.setEncoding('UTF-8');

    // 代表当前链接的昵称
    var nickname = null;

    // 向客户端输出信息
    conn.write(
        '\n > welcome to \033[90m node-chat \033[39m!'
      + '\n > ' + count + ' other people are connected at this time.'
      + '\n > please write your name and press enter: '
    );
    count++;

    // 监听data事件
    conn.on('data', function(data) {
        // 删除回车符
        data = data.replace('\r\n', '');
        // 接受用户昵称
        if (!nickname) {
            // 不允许昵称重复
            if (users[data]) {
                conn.write('\033[93m nickname already in use. please try again: \033[39m');
                return;
            } else {
                nickname = data;
                users[nickname] = conn;
                for (var i in users) {
                    broadcast('\033[90m > ' + nickname + ' joined the room\033[39m\n');
                    // users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
                }
            }
        } else {
            // 聊天信息
            for (var i in users) {
                // 发送信息给除自己之外的其他客户端
                if (i != nickname) {
                    broadcast('\033[90m > ' + nickname + ' : \033[39m' + data + '\n');
                    // users[i].write('\033[90m > ' + nickname + ' : \033[39m' + data + '\n');
                }
            }
        }
        console.log(data);
    });

    // 当客户端关闭,计数器变量递减
    conn.on('close', function() {
        count--;
        // 客户端关闭后,应该删除用户信息
        delete users[nickname];
        // 告诉其他客户端,有客户端退出
        broadcast('\033[90m > ' + nickname + ' left the room\033[39m\n')
    });
});

/* 监听 */
server.listen(3000, function() {
    console.log('\033[96m server listening on *:3000 \033[39m');
});

/* 向用户广播信息 */
function broadcast(msg, exceptMyself) {
    for (var i in users) {
        if (!exceptMyself || i != nickname) {
            users[i].write(msg);
        }
    }
}

项目运行前再CMD输入npm install ,添加项目需要的依赖;该项目没有外部依赖,最好还是运行一下,养成习惯,避免后期麻烦。然后输入node index.js 启动项目。

这里写图片描述

说明一下,我的系统是win10,telnet客户端无法打开所以在CMD中打开bash方式使用telnet客户端。win10中打开bash的方法请自行搜索。

这里写图片描述

根据提示输入用户昵称,并多启动几个客户端即可测试项目。

注:以上内容为学习笔记,摘自《了不起的Node.js》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值