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基本语法和类型
Feb 13 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodeJS实现简单网页爬虫功能的实例(分享)
Jun 08 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 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中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
2018/04/27 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
Python中的匿名函数使用简介
2015/04/27 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
python如何通过protobuf实现rpc
2016/03/06 Python
详解python3百度指数抓取实例
2016/12/12 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
对python函数签名的方法详解
2019/01/22 Python
python实现简单加密解密机制
2019/03/19 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
pytorch SENet实现案例
2020/06/24 Python
如何让python的运行速度得到提升
2020/07/08 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
公司应聘求职信
2014/06/21 职场文书
2016年元旦主持词
2015/07/06 职场文书
redis限流的实际应用
2021/04/24 Redis
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL