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 sublime text 3安装与配置
Jun 19 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
初始Nodejs
Nov 08 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
php中的curl_multi系列函数使用例子
2014/07/29 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
Javascript的闭包
2009/12/31 Javascript
基于jQuery的倒计时实现代码
2012/05/30 Javascript
javascript闭包入门示例
2014/04/30 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
Vue管理系统前端之组件拆分封装详解
2020/08/23 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
python paramiko模块学习分享
2017/08/23 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python中time库的实例使用方法
2019/10/31 Python
PyQt5事件处理之定时在控件上显示信息的代码
2020/03/25 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
医生自荐信
2013/10/11 职场文书
医院后勤自我鉴定
2013/10/13 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
普通党员对照检查材料
2014/09/24 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js