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学习笔记之入门篇
Apr 16 NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
PHP 中的批处理的实现
2007/06/14 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
JavaScript 设计模式学习 Factory
2009/07/29 Javascript
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
2016/01/12 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
python 实现A*算法的示例代码
2018/08/13 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
【python】matplotlib动态显示详解
2019/04/11 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
办公室秘书岗位职责范本
2014/02/11 职场文书
2014年纠风工作总结
2014/12/08 职场文书
卖车协议书范文
2016/03/23 职场文书
Python基础详解之描述符
2021/04/28 Python
小程序实现悬浮按钮的全过程记录
2021/10/16 HTML / CSS
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技