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 后缀名判断限制代码
Mar 31 NodeJs
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
Sep 26 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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执行速度全攻略(下)
2006/10/09 PHP
PHP file_exists问题杂谈
2012/05/07 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
基于JavaScript创建动态Dom
2015/12/08 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
2018/05/18 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
python基础教程之字典操作详解
2014/03/25 Python
使用Python编写一个简单的tic-tac-toe游戏的教程
2015/04/16 Python
Python3.x中自定义比较函数
2015/04/24 Python
Python实现备份MySQL数据库的方法示例
2018/01/11 Python
windows下python和pip安装教程
2018/05/25 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
高级电工工作职责
2013/11/21 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
预备党员公开承诺书
2014/05/28 职场文书
火箭队口号
2014/06/18 职场文书
党的群众路线教育实践活动自我剖析材料
2014/10/08 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
北京导游词
2015/02/12 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
2021/05/12 Python
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript