创建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`事件,在回调中处理错误
// 如果未能捕获错误,那么会抛出异常,终止程序