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 相关文章推荐
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs实现WebSocket代码实例
May 19 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
2013/03/29 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
javascript相等运算符与等同运算符详细介绍
2013/11/09 Javascript
JQuery中$.ajax()方法参数详解及应用
2013/12/12 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
超简单的Python HTTP服务
2019/07/22 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
实体的生命周期
2013/08/31 面试题
股权转让协议书范本
2014/04/12 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫