var net = require('net');
var server = net.createServer();
server.on('connection', function(socket){
socket.write("欢迎光临《深入浅出Node.js》示例:\n");
});
server.on('end', function () {
console.log('连接断开');
});
server.listen(8124, function () {
console.log('server bound');
});
var net = require('net');
var server = net.createServer(function (socket) {
// 新的连接
socket.on('data', function (data) {
console.log("from client:", data.toString());
socket.write("你好");
});
socket.on('end', function () {
console.log('连接断开');
});
socket.write("欢迎光临《深入浅出Node.js》示例:\n");
});
server.listen(8124, function () {
console.log('server bound');
});
var net = require('net');
var client = net.connect({port: 8124}, function () { //'connect' listener
console.log('client connected');
client.write('world!\r\n');
});
client.on('data', function (data) {
console.log("from server:", data.toString());
client.end();
});
client.on('end', function () {
console.log('client disconnected');
});
首先启动服务器端,然后启动客户端,结果如下
xiao@uXiao:~/nodejs/深入浅出nodejs/chapter7$ node server.js
server bound
from client: world!
连接断开
xiao@uXiao:~/nodejs/深入浅出nodejs/chapter7$ node client.js
client connected
from server: 欢迎光临《深入浅出Node.js》示例:
from server: 你好
client disconnected
在上述的示例中,代码分为服务器事件和连接事件
对于通过 net.createServer() 创建的服务器而言,它是一个 EventEmitter 实例,它的自定义事件有如下几种。
服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可写可读 Stream 对象。Stream 对象可以用于服务器端和客户端之间的通信,既可以通过 data 事件从一端读取另一端发来的数据,也可以通过 write() 方法从一端向另一端发送数据。它具有如下自定义事件。
TCP针对网络中的小数据包有一定的优化策略:Nagle算法。如果每次只发送一个字节的内容而不优化,网络中将充满只有极少数有效数据的数据包,将十分浪费网络资源。Nagle算法针对这种情况,要求缓冲区的数据达到一定数量或者一定时间后才将其发出,所以小数据包将会被Nagle算法合并,以此来优化网络。这种优化虽然使网络带宽被有效地使用,但是数据有可能被延迟发送。
在Node中,由于TCP默认启用了Nagle算法,可以调用 socket.setNoDelay(true) 去掉Nagle算法,使得 write() 可以立即发送数据到网络中。
另一个需要注意的是,尽管在网络的一端调用 write() 会触发另一端的 data 事件,但是并不意味着每次 write() 都会触发一次 data 事件,在关闭掉Nagle算法后,另一端可能会将接收到的多个小数据包合并,然后只触发一次 data 事件。