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中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 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
PHP 中的类
2006/10/09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
DIV随滚动条滚动而滚动的实现代码【推荐】
2016/04/12 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
2018/03/09 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
Python Collatz序列实现过程解析
2019/10/12 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
2020/05/25 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
.net笔试题
2014/03/03 面试题
文秘专业大学生求职信
2013/11/10 职场文书
平面设计师工作职责范文
2013/12/03 职场文书
电子商务个人自荐信
2013/12/12 职场文书
网上商城创业计划书范文
2014/01/31 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android