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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
php 中的4种标记风格介绍
2012/05/10 PHP
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
Jquery 动态循环输出表格具体方法
2013/11/23 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
JavaSciprt中处理字符串之sup()方法的使用教程
2015/06/08 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
Vue Autocomplete 自动完成功能简单示例
2019/05/25 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Tensorflow训练模型越来越慢的2种解决方案
2020/02/07 Python
Python中的With语句的使用及原理
2020/07/29 Python
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
保洁主管岗位职责
2013/11/20 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
平安建设汇报材料
2014/12/29 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
一次SQL如何查重及去重的实战记录
2022/03/13 MySQL
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python