其中,options是一个对象,指定创建套接字Server对象时要使用的选项,如allowHalfOpen,可以使一半的Duplex流保持开放,默认为false。connectLlistener是connection事件的回调函数,它在接收到连接时被执行。
举例:
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"事件:
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客户端连接到刚创建的服务器上,该客户端向服务器发送一串消息,并在得到服务器的反馈后关闭连接。下面的代码描述了这一过程。
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'); });
再举个例子:
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)); }); });