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服务器(7):阻塞操作的实现
Dec 18 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 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
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
php计算十二星座的函数代码
2012/08/21 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
两个Javascript小tip资料
2010/11/23 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
[42:32]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第二局
2016/02/27 DOTA
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
基于Python实现文件大小输出
2016/01/11 Python
pycharm安装图文教程
2017/05/02 Python
Python面向对象编程之继承与多态详解
2018/01/16 Python
python如何让类支持比较运算
2018/03/20 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
启动一个线程是用run()还是start()
2016/12/25 面试题
人力资源职位说明书
2014/07/29 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书