Nodejs之TCP服务端与客户端聊天程序详解

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个客户端的测试结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Node.js制作简单聊天室

    看了TCP的有关知识,写了个基于NET的聊天室. var net = require('net'); var count = 0, users = {}; var server = net.createServer(function (conn) { console.log('连接到'); conn.write( "\r\n > welcome to node-chat!" + "\r\n > " + count + " other peopl

  • AngularJS+Node.js实现在线聊天室

    不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍,对于基本的使用依然有很多说不清道不明的疑惑,于是决定通过做一个在线聊天室帮助理解.DEMO可以戳→chat room,代码可以戳→ChatRoom-AngularJS. 清晰图可以戳 http://files.jb51.net/file_images/article/201508/201508281040051.gif 功能 着手开发之前,首先明确一

  • 使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室

    一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

  • 使用Meteor配合Node.js编写实时聊天应用的范例

    我经常见到被拿来与Derby.js做比较的框架是Meteor.js. 与Derby相似的是,它也能在多个客户端下实时更新views, 尽管做法上可能跟Derby有点不同. Derby可以较容易的使用多种数据库, 而Meteor则只亲近于MongoDB. 事实上, 通过如Mongoose客户端接入数据库的API与你在服务端所期望的已经非常接近了. 虽然现在meteor是个有一些缺点和争议的框架, 但Meteor看起来是非常有趣的选择用来建立有实时需求的应用. 个人还是喜欢Derby基于传统回调的编

  • WebSocket+node.js创建即时通信的Web聊天服务器

    本文实例node.js创建即时通信的Web聊天服务器,供大家参考,具体内容如下 1.使用nodejs-websocket  nodejs-websocket是基于node.js编写的一个后端实现websocket协议的库,  连接:https://github.com/sitegui/nodejs-websocket.  (1)安装  在项目目录下通过npm安装:npm install nodejs-websocket  (2)创建服务器 //引入nodejs-websocket var ws

  • Node.js利用Net模块实现多人命令行聊天室的方法

    这篇文章介绍的是Node.js利用Net模块实现命令行式的多人聊天室,下面话不多说,来看看详细的介绍吧. 1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类: Server和Socket类.工厂方法. Server类如下图所示: net.Server类可以用来创建一个TCP或本地服务器,继承了EventEmitter. Socket类如下: net.Socket类一般用创建一个socket客户端或者是ne

  • Node.js中使用socket创建私聊和公聊聊天室

    先给大家展示效果图: 在上篇文章给大家介绍使用Angular和Nodejs.socket.io搭建聊天室及多人聊天室,本文继续介绍Node.js中使用socket创建私聊和公聊聊天室,具体详情请看下文吧. nodejs的应用中,关于socket应该是比较出彩的了,socket.io在github上有几万人的star,它的成功应该是不输于express的,为了方便了解整个socket.io的使用. 例子请点击http://chat.lovewebgames.com/ 源码下载https://git

  • Node.js实现简单聊天服务器

    使用Nodejs是如此简单的实现了一个简单的聊天服务器 实现代码如下: var net = require('net'); var chatServer = net.createServer(),clientList = []; chatServer.on("connection",function(client){ client.name = client.remoteAddress + ":" + client.remotePort; client.write(

  • nodejs实现的一个简单聊天室功能分享

    今天我来实现一个简单的聊天室,后台用nodejs, 客户端与服务端通信用socket.io,这是一个比较成熟的websocket框架. 初始工作 1.安装express, 用这个来托管socket.io,以及静态页面,命令npm install express --save,--save可以使包添加到package.json文件里. 2.安装socket.io,命令npm install socket.io --save. 编写服务端代码 首先我们通过express来托管网站,并附加到socke

  • 基于Node.js + WebSocket打造即时聊天程序嗨聊

    前端一直是一块充满惊喜的土地,不仅是那些富有创造性的页面,还有那些惊赞的效果及不断推出的新技术.像node.js这样的后端开拓者直接将前端人员的能力扩大到了后端.瞬间就有了一统天下的感觉,来往穿梭于前后端之间代码敲得飞起,从此由前端晋升为'前后端'. 本文将使用Node.js加web socket协议打造一个网页即时聊天程序,取名为HiChat,中文翻过来就是'嗨聊',听中文名有点像是专为寂寞单身男女打造的~ 其中将会使用到express和socket.io两个包模块,下面会有介绍. 源码 源码

随机推荐