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 npm package.json中文文档
Sep 04 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 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
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
php获得url参数中具有&的值的方法
2014/03/05 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP生成制作验证码的简单实例
2016/06/12 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
jQuery实现的仿百度分页足迹效果代码
2015/10/30 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
简单的js计算器实现
2016/10/26 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
vuex存储token示例
2019/11/11 Javascript
python写xml文件的操作实例
2014/10/05 Python
Python字符串详细介绍
2015/05/09 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python机器学习实战之树回归详解
2017/12/20 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
python爬虫 线程池创建并获取文件代码实例
2019/09/28 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
python一些性能分析的技巧
2020/08/30 Python
python 还原梯度下降算法实现一维线性回归
2020/10/22 Python
python爬取招聘要求等信息实例
2020/11/20 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
交通事故检查书范文
2014/01/30 职场文书
五好关工委申报材料
2014/05/31 职场文书
百日安全生产活动总结
2014/07/05 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
让生命充满爱观后感
2015/06/08 职场文书
听证会主持词
2015/07/03 职场文书