创建TCP服务器
传输控制协议(Transmission Control Protocol,TCP)是Internet的基础协议之一,它位于网际协议(Internet Protocol,,P)之上,为应用层提供了一种传输机制。例如,HTTP工作在TCP之上,其他很多面向连接的应用(诸如RC、SMTP和MAP)也工作在TCP之上。
Node以htp.Server伪类实现了HTTP服务器,改伪类继承自 .net Server中的TCP服务器伪类,这意味着本文所有内容也可以应用到Node HTTP服务器中去。
创建TCP服务器
const net = require('net');
const server = net.createServer(function (socket) {
socket.on("data", function (data) {
console.log(data);
socket.write("Create A TCP Server");
})
socket.on('end',function(data){
console.log(data);
})
})
server.listen(1234);
首先使用createServer
方法创建一个服务器对象,创建的时候可以传入一个回调,这个后面再说。
然后,创建的服务器对象server也是一个事件发射器,16行可以看到,发射一个listen
事件,上述代码中即:服务器绑定到本地1234端口,可以通过这个端口访问到服务器(最简单的方法就是在浏览器输入localhost:1234
,然后观察控制台输出)。
当然,除了在构造服务器对象时监听事件,还可以这样:
const server = net.createServer();
server.on("connect", function(socket) {
socket.end();// 断开端口链接
socket.close();// 关闭服务器
})
server.on("data", function(data) {
console.log(data);
})
应用套接字
当获取“connection”事件时也获得了一个套接字对象作为回调函数的第一个参数(参考上面的代码块),套接字对象既是可读流也是可写流,所以当它获取到数据包的时候会发射“data”事件,当链接关闭的时候会发射“end”事件。同时,应用socket.write
方法可以向套接字写入缓冲区或者字符串,通过socket.end
方法告诉写完数据之后终止连接。
const net = require('net');
const server = net.createServer();
server.on("connection", function (socket) {
console.log('new connection');
socket.setEncoding('utf-8');
socket.write("Hello Node!");
socket.on('data', function (data) {
console.log(data.toString());
})
})
server.on('end', function () {
console.log("Connection ended");
})
server.listen(1234);
这样,你就能通过TCP发送和接受数据了。
telnet:连接TCP的一个命令,window也可用,但是需要手动开启,在控制面板,找到程序与功能,进入,在左边找到启用或关闭windows功能,点击进入配置页面,勾选Telnet Client,即可在cmd使用telnet命令了。
同样,你可是试试怎么配合套接字使用一个只读流。
空闲套接字
可是设置超时时间,当超时之后关闭连接
const timeout = 30000; // 半分钟
const net = require('net');
const server = net.createServer();
server.on("connection", function (socket) {
// 设置超时时间
socket.setTimeout(timeout);
// 超时监听器
socket.on('timeout', function () {
socket.write("Timeout and connection ended!");
socket.end();
})
})
server.listen(1234);
设置保持运行
为了避免网络或者终端上出现超时,Node通过发送带有确认标志的空TCP包触发的空应答来确保连接持久保持,这会使两端一直处于连接状态。
可以通过一下代码保持运行功能:
socket.setKeepAlive(true);
// 指定最后接受到的包与下一个保持运行的空包之间的延时时间,可以通过添加第二个参数实现。
socket.setKeepAlive(true,30000);
延时或非延时
在发送TCP数据包之前,内核会使用Nagle算法来调整发送时间,也就是,你在代码里执行了发送操作,但是内核会缓冲这个数据,很可能不会马上帮你发送出去。
如果要使延迟失效,在write命令之后强制数据马上被发送出去,可以调用下面的方法:
socket.setNoDelay(true); // 不过一般不这么做,也不建议这么做
常用事件:
// 监听连接
server.listen(port, host); // port: 端口,host:地址(可选,如果忽略,会指向任意IP地址的链接
// 关闭连接
server.close(); // 关闭服务器(区别关闭连接socket.end())
// 处理错误
// 通过监听`error`事件,在回调中处理错误
// 如果未能捕获错误,那么会抛出异常,终止程序