Nodejs创建TCP服务器 - king0222

作者:mrr 时间:2022-12-16 02:27:27 

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();

标签:nodejs,tcp,服务器
0
投稿

猜你喜欢

  • 谷歌搜索引擎优化关于链接的九个基础问题

    2008-12-08 10:18:00
  • 空白密码引发远程连接Server2008失败

    2009-05-27 11:20:00
  • Godaddy注册后域名解析怎么设置

    2010-04-07 08:58:00
  • 使用vs2019进行Linux远程开发的方法步骤

    2023-10-08 21:20:26
  • QQ互联发布插件版 将支持Discuz! X1.5

    2011-08-02 19:30:13
  • 详解docker搭建redis集群的环境搭建

    2023-07-21 14:02:30
  • 中英网站的Google PR差距

    2007-11-05 18:47:00
  • seo第一站:网站诊断与分析

    2007-10-25 11:49:00
  • NAT/ICS下让外网用户访问内网WEB服务器

    2007-03-26 11:40:00
  • PHPWIND中文验证码如何显示

    2009-02-19 19:54:00
  • 如何监视FTP空间使用情况

    2009-12-10 19:27:00
  • phpcms实现站内搜索自动对应频道的方法

    2009-02-18 19:26:00
  • 巧妙管理交换机 揪出害群之马ARP病毒

    2010-02-21 10:06:00
  • linux之如何停止正在执行脚本

    2023-10-10 10:50:05
  • 网站信息提交到Alexa最新图文教程

    2010-03-26 20:18:00
  • 关于技术员的笑话

    2008-06-27 13:22:00
  • VPS主机CentOS系统安装LNMP环境图文教程分享

    2023-08-06 12:31:29
  • 关注网页游戏 互联网基础服务成关键

    2009-10-14 15:44:00
  • text-justify实现正文文字两端对齐

    2009-07-29 19:06:00
  • linux常用命令之VMware10中安装CentOS 6.4图文教程

    2023-01-22 05:39:23
  • asp之家 网站运营 m.aspxhome.com