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 模块开发及发布详解分享
Mar 07 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
详解nodejs微信公众号开发——4.自动回复各种消息
Apr 11 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs使用redis作为缓存介质实现的封装缓存类示例
Feb 07 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 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
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP中include与require使用方法区别详解
2013/10/19 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
jquery 3D球状导航的文章分类
2010/07/06 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
详解js的六大数据类型
2016/12/27 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
vue项目常用组件和框架结构介绍
2017/12/24 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
运行python提示no module named sklearn的解决方法
2020/11/29 Python
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
中学教师岗位职责
2013/11/26 职场文书
消防标语大全
2014/06/07 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
物业管理交接协议书
2016/03/24 职场文书
导游词之河北滦平金山岭长城
2019/10/16 职场文书
教你做个可爱的css滑动导航条
2021/06/15 HTML / CSS