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+express+html5 实现拖拽上传
Aug 08 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
Nodejs基于LRU算法实现的缓存处理操作示例
Mar 17 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 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/10/22 PHP
解析php php_openssl.dll的作用
2013/07/01 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
JS实现多功能计算器
2020/10/28 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
在Python中使用__slots__方法的详细教程
2015/04/28 Python
python实现基本进制转换的方法
2015/07/11 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
Python读写文件基础知识点
2019/06/10 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
keras之权重初始化方式
2020/05/21 Python
买房委托公证书
2014/04/08 职场文书
土地转让协议书
2014/04/15 职场文书
个人担保书范文
2014/05/20 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
西安兵马俑导游词
2015/02/02 职场文书
Python道路车道线检测的实现
2021/06/27 Python
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
教你部署vue项目到docker
2022/04/05 Vue.js