1.启动一个本地的服务
下面是官方的例子,会生成一个随机端口,返回的是纯文本:
var net = require('net'); var server = net.createServer((socket) => { socket.end('goodbye\n'); }).on('error', (err) => { // 处理错误 throw err; }); // 随机端口 server.listen(() => { console.log('opened server on', server.address()); });
指定一个端口:
server.listen({ port: 80 },() => { console.log('opened server on', server.address()); });
但是这时却报错了:Error: listen EACCES 0.0.0.0:80。
EACCES 表示的是 E|ACCES,即 acces error 访问错误,一般指没有权限,因为 0 ~ 1023 端口是公认端口,其对应的服务都是指定/默认的,需要权限去访问。
于是就需要使用管理员权限执行该命令:sudo node main.js。但是又出现问题了:Error: listen EADDRINUSE :::80。网上查了下查看端口的命令:lsof -i tcp:80,但是显示的列表里却找不到80端口对应的进程,是不是看漏了?执行一下 lsof -i | grep ':80',还是没有。再查下,原来 mac 有启动默认的 apache 服务,关掉 sudo apachectl stop。再执行 node 就成功了。
2. 返回文件.html
引入文件模块 var fs = require('fs'),使用异步读取文件的方法 fs.readFile:
var server = net.createServer(socket => { fs.readFile('../html/index.html', { encoding: 'utf-8' }, (err, data) => { socket.end(data); }); })
fs.readFile 是异步的,所以不能用它返回的值(undefined),可以用 fs.readFileSync
var server = net.createServer(socket => { var data = fs.readFile('../html/index.html', { encoding: 'utf-8' }); socket.end(data);
}).on('error', (err) => { throw err; });
一个最简单的本地服务器就这样完成了。注意:这是 tcp 服务器,不是 http 服务器,浏览器之所以能访问是因为 http 是建立在 tcp 之上的。
3.简单的 tcp 聊天室
let net = require('net');
// 保存连接 server 的 socket
let sockets = []; let server = net.createServer((socket) => { sockets.push(socket);
socket.on('data', (data) => {
sockets.forEach((e) => {
// 排除本身,转发给其他 socket
if(e != socket) {
e.write(data);
}
});
});
// 连接断开的时候从 sockets 里删除,避免错误
socket.on('end', function () {
let index = sockets.indexOf(socket);
sockets.splice(index, 1);
});
}).on('error', (err) => { // 处理错误 throw err; }); // 指定 8088 端口 server.listen(8088, () => { console.log('opened server on', server.address()); });
运行本示例,再使用 telnet 127.0.0.1 8088 连接,就能看到效果了。
参考
2.node_Net