nodejs简单实现TCP服务器端和客户端的聊天功能示例


Posted in NodeJs onJanuary 04, 2018

本文实例讲述了nodejs简单实现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);
  //从连接中读取数据
  socket.on('data', function(data){
    console.log('got data:', data);
    //广播数据
    //每当一个已连接的用户输入数据,就将这些数据广播给其他所有已连接的用户
    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, 1);
    });
  });
});
server.on('error', function(err){
  console.log('Server error:', err.message);
});
server.on('close', function(){
  console.log('Server closed');
});
server.listen(4000);

客户端

var net = require('net');
var port = 4000;
var quitting = false;
var conn;
var retryTimeout = 3000;  //三秒,定义三秒后重新连接
var retriedTimes = 0;  //记录重新连接的次数
var maxRetries = 10;  //最多重新连接十次
process.stdin.resume(); //process.stdin流来接受用户的键盘输入,这个可读流初始化时处于暂停状态,调用流上的resume()方法来恢复流
process.stdin.on('data', function(data){
  if (data.toString().trim().toLowerCase() === 'quit'){
    quitting = true;
    console.log('quitting');
    conn.end();
    process.stdin.pause();
  } else {
    conn.write(data);
  }
});
//连接时设置最多连接十次,并且开启定时器三秒后再连接
(function connect() {
  function reconnect() {
    if (retriedTimes >= maxRetries) {
      throw new Error('Max retries have been exceeded, I give up.');
    }
    retriedTimes +=1;
    setTimeout(connect, retryTimeout);
  }
  conn = net.createConnection(port);
  conn.on('connect', function() {
    retriedTimes = 0;
    console.log('connect to server');
  });
  conn.on('error', function(err) {
    console.log('Error in connection:', err);
  });
  conn.on('close', function() {
    if(! quitting) {
      console.log('connection got closed, will try to reconnect');
      reconnect();
    }
  });
  //打印
  conn.pipe(process.stdout, {end: false});
})();

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
浅谈Node的内存泄露问题
May 06 NodeJs
详解NODEJS的http实现
Jan 04 #NodeJs
Nodejs中crypto模块的安全知识讲解
Jan 03 #NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 #NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 #NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 #NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 #NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 #NodeJs
You might like
php表单转换textarea换行符的方法
2010/09/10 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
jquery改变tr背景色的示例代码
2013/12/28 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
python cookielib 登录人人网的实现代码
2012/12/19 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
Python脚本暴力破解栅栏密码
2015/10/19 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
python3对拉勾数据进行可视化分析的方法详解
2019/04/03 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
Python qrcode 生成一个二维码的实例详解
2020/02/12 Python
基于python3的socket聊天编程
2020/02/17 Python
python查看矩阵的行列号以及维数方式
2020/05/22 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
建材业务员岗位职责
2013/12/08 职场文书
中学自我评价
2014/01/31 职场文书
车间核算员岗位职责
2014/07/01 职场文书
岗位说明书怎么写
2014/07/30 职场文书
2014年教务处工作总结
2014/12/03 职场文书
导游词之神仙居景区
2019/11/15 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis