教你写一个基于TCP的简易聊天室

一、环境准备

Mac下命令查询网络端口占用情况
  • netstat命令

netstat -an | grep 3000

3000可以替换为你所需要查询的端口号

  • lsof命令

通过list open file命令可以查看到当前打开文件,在linux中所有事物都是以文件形式存在,包括网络链接及硬件设备;

lsof -i:3000

-i参数表示网络链接,:3000指明端口号,该命令会同时列出pid,方便kill

查看所有进程监听的端口

sudo lsof -i -P | grep -i "listen"

  • kill进程

kill pid

准备前可能遇到的问题
  • 端口号被占用,上面是查询相关命令;

  • 连接不上:项目没有启动,在项目目录下启动项目,eg: http目录下有个net.js文件(启动项目文件),可以在http的文件目录下执行:node net.js

Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
复制代码

二、 Show you the code

  • 建立一个文件夹:mkdir http
  • 建立项目文件: cd http && touch net.js
  • 注意:不要复制粘贴哦,跟着我一步一步敲下面代码吧

let clients = {} // 存在形式:{ '唯一的值': {name: '匿名',socket: socket}}

let server = net.createServer(function (socket) {
 let key = socket.remoteAddress + socket.remotePort;
 clients[key] = {
   name: '匿名',
   socket
 }
 server.getConnections(() => {
   socket.write('欢迎来到聊天室:\r\n');
 });
 socket.setEncoding('utf8');
 socket.on('data', function(data) {
   data = data.replace("\r\n", '');
   let char = data.split(":");
   switch (char[0]) {
     case 'l':
       list(socket); // 把列表显示给当前的用户
       break;
       case 'b': // b: 广播,向所有用户发消息
       broadCast(key, char[1]);
       break;
       case 's': // 私聊:向特定的人发消息
       private(char[1], char[2], key);
       break;
       case 'r': // 重命名
       rname(socket, char[1], key);
       break;
       default:
       break;
   }
 })
});
// let c = {'xxx': {name: 'whoareyou', socket}, 'qqq': {name: 'whocares'}}
function private(username, content, key) {
 let user = Object.values(clients).find(item => item.name == username);
 user.socket.write(`${clients[key].name}:${content}\r\n}`);
}
function broadCast(key, content) {
 for (let k in clients) {
   if (k != key) {
     clients[k].socket.write(`${clients[key].name}:${content}\r\n}`);
   }
 }
}
function rname(socket, newName, key) {
 clients[key].name = newName;
 socket.write(`恭喜:您的新名字是 ${newName}\r\n`);
}
function list(socket) {
 let userList = Object.values(clients).map(item => item.name).join('\r\n');
 socket.write(`当前用户列表\r\n${userList}\r\n`);
}
server.listen(3000, () => {
 console.log('Listening on port: 3000')
})
复制代码

三、 The end

写完这个简易的聊天程序后,感觉自己在演戏,一人分饰三角,我也是厉害了,哈哈哈。。。自娱自乐完之后,把其中乐趣也教给你吧:

  • 首先运行跟着我敲的代码:node net.js

  • 开启多个终端(Ctrl + N),就三个吧,当然你想体验多个也是可以的

  • 在每个终端执行:telnet localhost 3000 (Mac一般自带telnet)

  • 在每个终端进去之后,最好先重命名一下,让别人知道你是谁(根据代码,可执行:r: 你的名字)

  • 注意:输入信息之前需要加上 :

    // l: 显示所有用户
    // b: 广播
    // s:(此处是你要私聊的对象名字): 私聊
    // r:(此处是你重命名后的名字)
    复制代码
  • 奉上我的抽风之作(绝对是个戏精。。):

转载于:https://juejin.im/post/5b7ecb786fb9a01a0c0fe522

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值