Nodejs之TCP服务端与客户端聊天程序详解


Posted in NodeJs onJuly 07, 2017

TCP是用来计算机之间进行通信的,通过编写客户端和服务端聊天的代码,对于服务器与客户端的工作步骤有了深刻的了解,在这里根据了不起的Node.js一书来总结一下。

TCP聊天程序需要用到Nodejs中的net模块,net模块是对TCP的封装,用于创建TCP服务端与客户端的。

服务器端

count:连接的客户端个数;
users:用于存储客户端用户昵称的对象,对象值都为该客户端的Socket,Socket是一个接口,用于服务端与客户端通信。
net.createServer:是用来创建TCP服务器,传递的函数为connetion事件的监听器,connection事件在有客户端连接上服务器后触发,传进去的参数conn是一个socket,即net.Socket的实例,是既可读也可写的。
conn:是回调函数的参数,每一个客户端对应的conn都是不一样的,服务器会自动识别。
conn.write:是将数据发送到客户端上。
nickname:是额户端的昵称,当nickname为undefined时,代表客户端还没有输入昵称,需要输入昵称验证,若不为空则已经存储,代表输入的数据是对话,需显示到其他的客户端上。
conn.on('data',function (data){…}):是用来接收客户端传来的数据。

/*server.js*/
  var net=require('net');
  var count=0;
  var users={};
  
  var server=net.createServer(function (conn) {
    conn.setEncoding('utf8');
    conn.write(count+' people are connected'
      +'\nplease write your nickname:');
    count++;
    var nickname;
    conn.on('data',function (data) {
      data=data.replace(/\r\n/,'');
      if(!nickname){
        if(users[data]){
          conn.write('\n nickname already used,try again:');
          return;
        }else {
          nickname=data;
          users[nickname]=conn;//每个客户端对应的conn是不一样的
          for(var i in users){
            users[i].write(nickname+' join the romm\n');
          }
        }
      }else {
        conn.write('发送者nickname: '+nickname+'\n');
        for(var i in users){
          if(i!=nickname){
            users[i].write(nickname+': '+data+'\n');
          }
        }
      }
    });
    conn.on('close',function () {//这里防止连接出错,使用close而非end
      console.log(nickname+' client disconnected\n');
      count--;
      delete users[nickname];
    });
    conn.on('error',function (err) {
      console.log('Error in connection:'+ err+'\n');
    });
  }).listen(3000,function () {
    console.log('server is listenning on 3000');
  });

客户端

process.stdin.resume():process.stdin流来接受用户的键盘输入,这个可读流初始化时处于暂停状态,调用流上的resume()方法来恢复流。
process.stdin.on('data', function(data){…}):是用来获取键盘的输入,并用client.write()将它发送到服务端。
stop:用来判断客户端是否是正常断开连接。
net.createConnection:是用来创建于服务端的连接,并且给connect事件自动添加监听器,监听器不接收参数。返回的是 'net.Socket'。

/*client.js*/
  var net=require('net');
  var stop = false;
  process.stdin.resume(); 
  
  process.stdin.on('data', function(data){
    if(data.toString().trim().toLowerCase()==='stop'){
      stop=true;
      console.log('connection stop\n');
      client.end();
    }else{
      client.write(data);
    }
  });
  
  var client=net.createConnection(3000,function () {
    console.log('connected to server!\n');
  });
  client.on('data', function(data) {
    console.log(data.toString());//打印服务器发送的数据
  });
  client.on('error', function(err) {
    console.log('Error in connection:'+ err+'\n');
  });
  client.on('close', function() {
    if(! stop) {
      console.log('connection got closed');
    }
  });

TCP聊天程序

这里是在git中运行的,连接了3个客户端的测试结果:

Nodejs之TCP服务端与客户端聊天程序详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
用Nodejs搭建服务器访问html、css、JS等静态资源文件
Apr 28 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
Nodejs之http的表单提交
Jul 07 #NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 #NodeJs
nodejs模块学习之connect解析
Jul 05 #NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 #NodeJs
nodejs 子进程正确的打开方式
Jul 03 #NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 #NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 #NodeJs
You might like
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
php7性能提升的原因详解
2019/10/13 PHP
javascript 读取图片文件的大小
2009/06/25 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
axios使用拦截器统一处理所有的http请求的方法
2018/11/02 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
自定义Vue中的v-module双向绑定的实现
2019/04/17 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
Django入门使用示例
2017/12/12 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
Python连接Impala实现步骤解析
2020/08/04 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
佳能德国网上商店:Canon德国
2017/03/18 全球购物
怎样自定义一个异常类
2016/09/27 面试题
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
运动会广播稿150字(9篇)
2014/09/20 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
安全隐患整改报告
2014/11/06 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
原型和原型链 prototype和proto的区别详情
2021/11/02 Javascript
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL