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命令行参数处理模块commander使用实例
Sep 17 NodeJs
nodejs调用cmd命令实现复制目录
May 04 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs+express实现文件上传下载管理网站
Mar 15 NodeJs
详解nodejs操作mongodb数据库封装DB类
Apr 10 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 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 防恶意刷新实现代码
2010/05/16 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
destoon各类调用汇总
2014/06/20 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP7 list() 函数修改
2021/03/09 PHP
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
简单了解django文件下载方式
2020/02/10 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
轻松制作精彩视频:Animoto
2018/09/19 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
单位门卫岗位职责
2013/12/20 职场文书
法制宣传月活动总结
2014/04/29 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
中层干部培训方案
2014/06/16 职场文书
2014年节能工作总结
2014/12/18 职场文书
数学教师求职信范文
2015/03/20 职场文书
企业团队精神心得体会
2016/01/19 职场文书