Unix域套接字,主要介绍NodeJS中TCP的基本编程知识。
2. 创建一个Socket对象,可以使用以下方法:
rush:js;">
//第一种
方法,通过
一个options参数
var SocketClient = net.connect(options,[connectionListener]);
var SocketClient = net.createConnection(options,[connectionListener]);
//第二种
方法,通过接受port和host值作为直接的参数
var SocketClient = net.connect(port,[host],[connectionListener]);
var SocketClient = net.createConnection(port,[connectionListener]);
//第三种
方法,通过接受指定
文件系统位置的path参数,这个位置是
一个Unix
套接字在创建Socket对象时使用的。
var SocketClient = net.connect(path,[connectionListener]);
var SocketClient = net.createConnection(path,[connectionListener]);
无论你使用哪种,都将返回一个Socket对象,唯一的区别在于接受的第一个参数,而最后一个参数都是当连接对服务器打开时执行的回调函数。而无论你使用net.connect
还是net.createConncetion
,它们的工作方式是完全相同的。
那么至于第一个参数,指定的选项为:
默认为localhost
一个布尔值,如果为true,则表示当套接字的另一端发送一个FIN数据包时,该套接字将不会自动发送一个FIN数据包,从而使Duplex流的一半保持开放。默认为false
3. 一旦Socket对象被创建,它就提供了在连接到服务器的生命周期中发出的几个事件,如下:
函数不接受任何参数
套接字上收到数据时发出。如果没有数据时间处理程序被连接,那么数据可能会丢失。回调函数必须接受一个buffer对象作为参数,它包含从套接字读取的数据的块。
一个FIN终止连接时发出。回调函数不接受任何参数
套接字中的数据流。回调函数不接受任何参数
套接字连接上发生错误时发出。回调函数应该接受错误的唯一参数。
套接字已完全关闭时发出,它可能是由一个end()方法关闭的,或者因为发生错误而关闭。回调函数不接受任何参数
4. Socket对象还提供了可以访问以获得该对象的信息的几个属性:
套接字的流中的字节数
套接字连接到的远程服务器的IP地址
套接字连接到的远程服务器的端口
套接字连接的本地IP地址
套接字连接的本地端口
套接字读取的字节数
套接字写入的字节数
三、net.Server对象
可以使用net.Server对象创建一个TCP套接字服务器,并监听对它的连接,你将能够读取和写入数据。
要创建一个服务器独享,使用net.createServer()
方法:
rush:js;">
net.createServer([options],[connectListener])
其中,options是一个对象,指定创建套接字Server对象时要使用的选项,如allowHalfOpen,可以使一半的Duplex流保持开放,默认为false。connectLlistener
是connection
事件的回调函数,它在接收到连接时被执行。
举例:
rush:js;">
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969;
// 创建
一个TCP服务器实例,
调用listen
函数开始监听指定端口
// 传入net.createServer()的回调
函数将作为”connection“事件的处理
函数
// 在每
一个“connection”事件中,该回调
函数接收到的socket对象是唯一的
net.createServer(function(sock) {
// 我们获得
一个连接 - 该连接
自动关联
一个socket对象
console.log('CONNECTED: ' + sock.remoteAddress + ':' + sock.remotePort);
// 为这个socket实例
添加一个"data"事件处理
函数
sock.on('data',function(data) {
console.log('DATA ' + sock.remoteAddress + ': ' + data);
// 回发该数据,客户端将收到来自服务端的数据
sock.write('You said "' + data + '"');
});
// 为这个socket实例
添加一个"close"事件处理
函数
sock.on('close',function(data) {
console.log('CLOSED: ' +
sock.remoteAddress + ' ' + sock.remotePort);
});
}).listen(PORT,HOST);
console.log('Server listening on ' + HOST +':'+ PORT);
服务端也可以用稍不同的方式接受TCP连接,即显式处理"connection"事件:
rush:js;">
var server = net.createServer();
server.listen(PORT,HOST);
console.log('Server listening on ' +
server.address().address + ':' + server.address().port);
server.on('connection',function(sock) {
console.log('CONNECTED: ' +
sock.remoteAddress +':'+ sock.remotePort);
// 其它
内容与前例相同
});
上述两个例子只是写法不同,并无本质区别。
创建TCP客户端
现在让我们创建一个TCP客户端连接到刚创建的服务器上,该客户端向服务器发送一串消息,并在得到服务器的反馈后关闭连接。下面的代码描述了这一过程。
rush:js;">
var net = require('net');
var HOST = '127.0.0.1';
var PORT = 6969;
var client = new net
.socket();
client.connect(PORT,HOST,function() {
console.log('CONNECTED TO: ' + HOST + ':' + PORT);
// 建立连接后立即向服务器发送数据,服务器将收到这些数据
client.write('I am Chuck
norris!');
});
// 为客户端
添加“data”事件处理
函数
// data是服务器发回的数据
client.on('data',function(data) {
console.log('DATA: ' + data);
// 完全
关闭连接
client.destroy();
});
// 为客户端
添加“close”事件处理
函数
client.on('close',function() {
console.log('Connection closed');
});
再举个例子:
rush:js;">
var net=require('net');
function getConnection(connName){
var client=net.connect({port:8017,host:'127.0.0.1'},function(){
console.log(connName+' connected: ');
console.log(' local=
%s:
%s',this.localAddress,this.localPort);
console.log( ' remote=
%s:
%s',this.remoteAddress,this.remotePort);
this.setTimeout(500);
this.setEncoding('utf8');
this.on('data',function(data){
console.log(connName+' From Server: '+data.toString());
this.end();
});
this.on('end',function(){
console.log(connName+' Client
disnected');
});
this.on('error',function(err){
console.log('Socket Error: ',JSON.stringify(err));
});
this.on('timeout',function(){
console.log('Socket Time Out');
});
this.on('close',function(){
console.log('Socket Closed');
});
});
return client;
}
function writeData(socket,data){
var success=!socket.write(data);
if(!success){
(function (socket,data){
socket.once('drain',function(){
writeData(socket,data);
});
})(socket,data);
}
}
var example1=getConnection('example1');
var example2=getConnection('example2');
writeData(example1,'This is example1');
writeData(example2,'This is example2');
var server=net.createServer(function(client){
console.log('Client connection: ');
console.log(' local=
%s:
%s',client.localAddress,client.localPort);
console.log( ' remote=
%s:
%s',client.remoteAddress,client.remotePort);
client.setTimeout(500);
client.setEncoding('utf8');
client.on('data',function(data){
console.log('Received data from client on port %d:
%s',client.remotePort,data.toString());
console.log(' Bytes received:'+data.toString());
writeData(client,'Sending: '+data.toString());
console.log(' Bytes sent: '+client.bytesWritten)
});
client.on('end',function(){
console.log('Client
disconnected');
server.getConnections(function(err,count){
console.log('Remaining Connections: '+count);
});
});
client.on('error',function(err){
console.log('Socket Error: '+JSON.stringify(err));
});
client.on('timeout',function(){
console.log('Socket Time Out');
});
});
server.listen(8017,function(){
console.log('Server listening: '+JSON.stringify(server.address()));
server.on('close',function(){
console.log('Server Terminated');
});
server.on('error',function(err){
console.log('Server Error: ',JSON.stringify(err));
});
});
希望本文所述对大家nodejs程序设计有所帮助。