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的10个性能优化技巧
Jul 15 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 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连接Oracle数据库
2006/10/09 PHP
php设计模式小结
2013/02/15 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP实用小技巧之调用录像的方法
2019/12/05 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
javascript实现支持移动设备画廊
2015/08/24 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
Python 关于反射和类的特殊成员方法
2017/09/14 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
PyQt5实现简易电子词典
2019/06/25 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Java Spring项目国际化(i18n)详细方法与实例
2020/03/20 Python
python regex库实例用法总结
2021/01/03 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
联想马亚西亚官方网站:Lenovo Malaysia
2018/09/19 全球购物
介绍一下linux文件系统分配策略
2012/11/17 面试题
自荐信怎么写好
2013/11/11 职场文书
会计电算化个人自我评价
2013/11/17 职场文书
公司承诺书格式
2014/05/21 职场文书
高考励志标语
2014/06/05 职场文书
学校实习推荐信
2015/03/27 职场文书
郭明义电影观后感
2015/06/08 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js
Fluentd搭建日志收集服务
2022/09/23 Servers