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中exports与module.exports的区别详细介绍
Jan 14 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
初始Nodejs
Nov 08 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 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
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
ext监听事件方法[初级篇]
2008/04/27 Javascript
Cookie 注入是怎样产生的
2009/04/08 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
python实现计算器功能
2019/10/31 Python
Python多进程multiprocessing、进程池用法实例分析
2020/03/24 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
pytorch判断是否cuda 判断变量类型方式
2020/06/23 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
联想台湾官网:Lenovo TW
2018/05/09 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
服装设计专业毕业生推荐信
2013/11/09 职场文书
和平主题的演讲稿
2014/01/12 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
2015大一新生军训感言
2015/08/01 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫