一、环境准备
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:(此处是你重命名后的名字) 复制代码
-
奉上我的抽风之作(绝对是个戏精。。):