百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 网站模板(百分百源码网)>电脑软件>服务器> Nodejs新建TCP服务器 - king0222
分享本文到:

Nodejs新建TCP服务器 - king0222

发布时间:05/16 来源:未知 浏览: 关键词:

1.Nodejs供给了net模块给我们,所以我们新建TCP服务器很简略:

 require('net').createServer(function(socket) {
   // new connection
   socket.on('data', function(data) {
     // got data
   });
   socket.on('end', function(data) {
     // connection closed
   });
   socket.write('Some string');
 }).listen();

通过var server = require('net').createServer();这行代码我们可以得到tcp服务器对象的援用。

server对象具注册了下列几个监听事件:

listening,connection,close,error

下面一个例子是在TCP服务器的声明周期中监听了如上几个事件:

var server = require('net').createServer();
 var port = ;
 server.on('listening', function() {
   console.log('Server is listening on port', port);
 });
 server.on('connection', function(socket) {
   console.log('Server has a new connection');
   socket.end();
   server.close();
 });
 server.on('close', function() {
   console.log('Server is now closed');
 });
 server.on('error', function(err) {
   console.log('Error occurred:', err.message);
 });
 server.listen(port);

一旦创立连贯成功后,会得到一个socket对象作为回调中的参数,我们可以操纵这个socket对象,前面提到过tcp连贯的对象是可读可写的流。作为一个流对象,因而能够监听data,end等事件;作为一个可写流,拥有write()要领。 下面是一个能够监听会员输入的例子:

 var server = require('net').createServer(function(socket) {
   console.log('new connection');
   socket.setEncoding('utf');
   socket.write("Hello! You can start typing. Type 'quit' to exit.\n");
   socket.on('data', function(data) {
     console.log('got:', data.toString())
     if (data.trim().toLowerCase() === 'quit') {
       socket.write('Bye bye!');
       return socket.end();
     }
     //反应回客户端
     socket.write(data);
   });
   socket.on('end', function() {
     console.log('Client connection ended');
   });
 }).listen();

由于socket对象又是一个可读的流,因而你能够空气他的pause()和resume(),或者你可以直接运用pipe()要领输出一个可写流:

 var ws = require('fs').createWriteStream('helloworld.txt');
 require('net').createServer(function(socket) {
   socket.pipe(ws);
 }).listen();

上面的代码新建了一个可写流对象,然后将这个可写流对象输出到客户端。在客户端可以得到一个名为helloworld.txt的文件,

可以用“telnet localhost 4001”来测试该例子。

由于socket对象同时拥有可读流的性质和可写流的性质,因而上面的例子你可以反过来构成下面这样的代码:

 require('net').createServer(function(socket) {
   var rs = require('fs').createReadStream('hello.txt');
   rs.pipe(socket);
 }).listen();

上面的代码将hello.text文件内容输出到socket对象中返回给客户端,当内容输出完成后,tcp连贯就会退出,在前面的文章中有说过Pipe的用法,默许状况下在数据读取完成后就会施行end要领,因而要是不想要这样的结果并维持连贯的话可以在pipe中增加第二个参数:{ end : false },并重写end监听。

2.闲置socket 当有闲置的socket涌现的时候我们需要进行响应的革除的工作,由setTimeout要领可以帮我们把闲置的socket对象关闭。

 var timeout = ; // minute
 socket.setTimeout(timeout);
 socket.on('timeout', function() {
   socket.write('idle timeout, disconnecting, bye!');
   socket.end();
 });

下面是一个更简约的运用方式:

 socket.setTimeout(60000, function() {
   socket.end('idle timeout, disconnecting, bye!');
 });

3.维持连贯

复制代码 代码如下:

socket.setKeepAlive(true);

你也可以增加第二个参数在设置可延时时长:

复制代码 代码如下:

socket.setKeepAlive(true, 10000); // 10 seconds

4.是否运用延时

kernel会在发送tcp数据包以前缓存数据,因而会占领一定的延时,这关于某些小数据包场景来说是有用的,但要是你不但愿有这样的延时的话,那么你可以这样设置:

复制代码 代码如下:

socket.setNoDelay(true);

 var port = ;
 var host = '...';
 server.listen(port, host);

listen要领的第二个参数是监听客户端的ip地址,要是填写则只监听所填写的ip,否则则监听所有ip地址,默许状况下不填写。 关闭服务器连贯,我们可以运用close要领,同时也可以对该事件进行监听。

复制代码 代码如下:

 server.close();
 server.on('close', function() {
     console.log('server closed!');
 });

6.新建一个简略的TCP谈天室服务器

var net = require('net');
 var server = net.createServer();
 var sockets = [];
 server.on('connection', function(socket) {
   console.log('got a new connection');
   sockets.push(socket);
   console.log('sockets length:', sockets.length);
   socket.on('data', function(data) {
     console.log('got data:', data.toString());
     sockets.forEach(function(otherSocket) {
       if (otherSocket !== socket) {
         otherSocket.write(data);
       }
     });
   });
   socket.on('close', function() {
     console.log('connection closed');
     var index = sockets.indexOf(socket);
     sockets.splice(index, );
     console.log('sockets length:', sockets.length);
   });
 });
 server.on('error', function(err) {
   console.log('Server error:', err.message);
 });
 server.on('close', function() {
   console.log('Server closed');
 });
 server.listen();

热门标签:dede模板 / destoon模板 / dedecms模版 / 织梦模板
责任编辑:zii9A
打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有152人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助



订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板