Nodejs创建TCP服务器 - king0222

 更新时间:2015年09月24日 15:16:26   投稿:mrr  
这篇文章主要介绍了Nodejs创建TCP服务器 - king0222的相关资料,需要的朋友可以参考下

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

相关文章

  • 使用Npcap库开发简单的扫描功能

    使用Npcap库开发简单的扫描功能

    nmap(Network Mapper)是一款开源免费的针对大型网络的端口扫描工具,nmap可以检测目标主机是否在线、主机端口开放情况、检测主机运行的服务类型及版本信息、检测操作系统与设备类型等信息,本文主要介绍nmap工具安装和基本使用方法,
    2024-08-08
  • 服务器ssh实现钉钉机器人告警

    服务器ssh实现钉钉机器人告警

    钉钉开放平台机器人可应用消息推送、监控报警等多种场景中,这篇文章主要介绍了服务器ssh实现钉钉机器人告警方法,需要的朋友可以参考下
    2024-07-07
  • Linux阿里云服务器中安装Nginx命令的详细过程

    Linux阿里云服务器中安装Nginx命令的详细过程

    这篇文章主要介绍了Linux(阿里云服务器)中安装Nginx命令,主要包括安装nginx依赖和配置环境变量的相关知识,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • IBM服务器诊断面板使用方法

    IBM服务器诊断面板使用方法

    IBM服务器一般会有一个服务器操作员信息面板(诊断面板),服务器一般的硬件故障都会在诊断面板上提示,但这些提示可能只是一个大概的诊断故障,有助于系统管理员更好的维护
    2018-05-05
  • 基于注解的Dubbo服务配置方法(实例讲解)

    基于注解的Dubbo服务配置方法(实例讲解)

    下面小编就为大家带来一篇基于注解的Dubbo服务配置方法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 服务器断电导致虚拟机数据丢失的恢复方法详解

    服务器断电导致虚拟机数据丢失的恢复方法详解

    这篇文章主要介绍了服务器断电导致虚拟机数据丢失的恢复方法,较为详细的分析了服务器断电导致的数据丢失情况与相应的故障处理技巧,需要的朋友可以参考下
    2018-01-01
  • RHEL网络服务器详解

    RHEL网络服务器详解

    这篇文章主要介绍了RHEL网络服务器的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • aws服务器更换实例规格后ssh无法登陆的解决方案

    aws服务器更换实例规格后ssh无法登陆的解决方案

    这篇文章主要介绍了aws服务器更换实例规格后ssh无法登陆,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • 云服务器搭建Hadoop分布式的过程详解

    云服务器搭建Hadoop分布式的过程详解

    这篇文章主要介绍了云服务器搭建Hadoop分布式的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • Mime类型与文件后缀对照表

    Mime类型与文件后缀对照表

    估计很多朋友对不同后缀的文件对应的MIME类型不熟悉(实际上这么多我也记不住),所以将平常常见的一些文件后缀对应的MIME类型写了一个对照表,现在奉献给大家
    2012-03-03

最新评论