node平台具有事件驱动,单线程,异步IO非阻塞等特性,有非常好的可伸缩性,适合在分布式网络里扮演各种各样的角色。
TCP服务在网络应用中十分常见,大多数的应用是基于TCP搭建的。TCP全名传输控制协议,在7层模型里属于传输层协议。同时TCP服务是面向连接的服务,需要进行三次握手形成对话。
var net = require('net');
var server = net.createServer(function (socket) {
socket.on('data',function (data) {
socket.write('hello !');
});
socket.on('end',function () {
console.log("连接断开");
});
socket.write("welcome!");
});
server.listen(8124,function () {
console.log("server bound");
});
我们使用net.createServer(listener)创建服务器,而listener是监听器,它本质上是一个EventEmitter实例,他的自定义绑定监听事件包括listening,connection,close,error下面的方式也可实现监听功能。
var net = require("net");
var server = net.creatServer();
server.on('connection',function(){
//连接后的内容
console.log("connect");
});
server.listen(8124);
我们可以利用Telnet来进行简单连接请求。
telnet 127.0.0.1 8124
或是通过net模块进行会话。
var net =require("net");
var client = net.connect({port:8124},function () {
console.log("client conneted");
client.write("world");
});
client.on("data",function (data) {
console.log(data.toString());
client.end();
});
client.on("end",function () {
console.log("client disconneting");
});
服务器可以同时与多个客户端保持连接,对于每个连接而言是典型的可写可读的stream对象,他既可以通过data事件读取,也可以通过write()方法发送数据。它具有的自定义事件包括data,end,connect,drain,error,close,timeout,除此之外可以利用pipe实现管道操作
var server = net.creatServer(function(socket){
socket.pipe(socket);
})
同时,TCP针对网络中的小数据包使用Nagle算法进行优化,要求缓冲区的数据达到一定数据或者一定时间才发出,所以小数据包可能会合并发出,这样虽然网络带宽能有效使用,但是数据可能被延迟发送。如果不想使用,可以使用socket.setNoDelay(true)去掉。
UDP套接字既可以作为客户端发送数据,也可以作为服务器接收数据。
想让套接字接收网络消息,绑定网卡和端口即可。
var dgram = require("dgram");
var server = dgram.createSocket("udp4");
server.on("message",function(msg,rinfo){
console.log("server got:" + msg + " from " + rinfo.address + ":" + rinfo.port);
});
server.on("listening",function(){
var address = server.address();
console.log("server listening" + address.address + ":" + address.port);
});
server.bind(41234);
var dgram = require("dgram");
var message = new Buffer("nodejs");
var client = dgram.createSocket("udp4");
client.send(message,0,message.length,41234,"localhost",function(err,bytes){
client.close();
});
这里发送参数
socket.send(buf,offset,length,port,address,[callback]).