阅读原文
前言
TCP 为传输层协议,在 NodeJS 中,基于 TCP 的核心模块为 net
,http
和 https
模块都是基于 net
实现的,我们先简单介绍 net
的用法,再根据 net
实现一个简易的聊天室。
net 模块的基本用法
1、使用 net 创建一个网络服务
方式 1:
const net = require("net");
// 创建 TCP 服务
const server = net.createServer(function(socket) {
// ......
});
server.listen(3000);
方式 2:
const net = require("net");
// 创建 TCP 服务
const server = net.createServer();
// 监听连接
server.on("connection", function(socket) {
// ......
});
server.listen(3000);
上面两种创建网络服务的方式第二种更常用,回调函数的参数都为 socket
(套接字),在产生连接时执行,每产生一个连接就会产生一个 socket
,我们也可以将 socket
理解为客户端。
如果现在使用浏览器连接这个服务可以成功接收到请求,但浏览器是 http
协议,不识别,所以不会有任何响应。
2、使用 TCP 模拟 http
const net = require("net");
// 创建 TCP 服务
const server = net.createServer();
// 监听连接
server.on("connection", function(socket) {
// 设置编码
socket.setEncoding("utf8");
// 读取请求报文
socket.on("data", function(data) {
console.log(data);
});
// 给浏览器返回响应报文
socket.write(`
HTTP/1.1 200 ok
Content-Length: 5
hello
`);
});
server.listen(3000);
// GET /favicon.ico HTTP/1.1
// Host: localhost:3000
// Connection: keep-alive
// Pragma: no-cache
// Cache-Control: no-cache
// ...... 后面省略
soket
是一个可读可写流 Duplex(双工流),所以既可以读取来自浏览器的请求信息,又可以写入响应信息,在模拟 http
时需遵循 http
协议规则,每行前面不允许有空格或制表符,响应头与响应正文之间需空一行。
此时启动服务,使用浏览器访问 localhost:3000 可以在控制台打印请求报文,并在浏览器中显示 hello
。
http
的头部信息可以通过命令窗口中使用 curl
发送请求进行查看,输入命令为 curl -v http://.....
,默认命令行窗口是不支持 curl
命令的,请在 curl 官网 下载系统对应的版本,在 Windows 系统中,下载后的压缩包解压后将 curl.exe
和 ca-bundle.crt
拷贝至 C:\Windows\System32
或将所在文件夹添加至系统环境变量。
3、server、socket 的属性和方法
在 TCP 创建的服务 server
和连接中的 socket
本身具有一些属性、方法和事件,我们通过下面这个例子来介绍。
const net = require("net");
// 创建 TCP 服务器
const server = ne