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和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs前端模板引擎swig入门详解
May 15 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
基于nodejs的雪碧图制作工具的示例代码
Nov 05 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 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页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php中strtotime函数用法详解
2014/11/15 PHP
简单谈谈favicon
2015/06/10 PHP
jquery ajax 调用失败的原因示例介绍
2013/09/27 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
vue $set 给数据赋值的实例
2019/11/09 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
Python中用于返回绝对值的abs()方法
2015/05/14 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
个人找工作的自我评价
2013/10/17 职场文书
护理学应聘自荐书范文
2014/02/05 职场文书
护林防火标语
2014/06/27 职场文书
学校安全责任书范本
2014/07/23 职场文书
大学生翘课检讨书范文
2014/10/06 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技