nodejs的cs模式聊天客户端和服务器实现

 学习完nodejs的基础后,自然要写点东西练练手,以下是一个基于nodejs的cs模式的聊天软件代码:

 net模块是nodejs的网络编程必定用到的一个模块,对socket通信进行了封装

 实现的功能:客户端和服务器通过终端输入的方式,能够互相发送接收数据,并且服务器下发的数据所有的客户端都能收到,客户端能正常断开连接,不会影响到服务器。

 服务器端代码:

var net = require("net");

/* 客户端的socket连接列表数组,最多保存1000个端 */

var socketList = new Array(1000);

/* 当前最大连接的数量,记个水平线,提高遍历效率 */

var nMaxCount = 0;

var port = 9999;

var ip = "127.0.0.1";

var server = net.createServer();

/* 监听端口和ip */

server.listen(port, ip);

/* 有客户端连接上时会触发 */

server.on("connection", function(socket){

   /* 输出连接的ip */

   console.log(socket.remoteAddress + " connected to server");

   /* 发送一个hello给连接上来的客户端 */

   socket.write("hello");

   /* 加入连接列表中 */

   var nIndex = 0;

   for(; nIndex < nMaxCount; nIndex++){

      if(socketList[nIndex] == 0){

        socketList[nIndex] = socket;

        break;

      }

   }   

   if(nIndex >= nMaxCount && nMaxCount < 1000){

     socketList[nMaxCount] = socket;

     nMaxCount++;

   }

   /* 监听数据 */

   socket.on("data", function(data){

     /* 标准输出接收到的数据 */

     process.stdout.write(data);

   });

   /* 监听到客户端断开连接 */

   socket.on("error", function(err){

     console.log("error msg: " + err);

     /* 移除该连接 */

      for(var i = 0; i < nMaxCount; i++){

       if(socketList[i] == socket){

          socketList[i] = 0;

          socket.end();

          break;

       }

     }

   });

});

/* 打开标准输入流 */

process.stdin.resume();

/* 将终端输入的数据发送给每一个连接上的客户端 */

process.stdin.on("data", function(data){

  for(var i = 0; i < nMaxCount; i++){

    if(socketList[i] != 0){

      socketList[i].write(data);

    }

  }

});

 

 

 客户端代码:

var net = require("net");

var port = 9999;

var ip = "127.0.0.1";

/* 创建连接到服务器的socket  */

var socketClient = net.createConnection(port, ip, function(socket){   console.log("connected"); });

/* 客户端收到服务器发送数据 */

socketClient.on("data", function(data){   process.stdout.write(data); });

socketClient.on("error", function(error){

  console.log("error msg: " + error);

  socketClient.destroy();

});

socketClient.on("close", function(){

  console.log("server closed");   process.exit(1);

});

/* 打开标准输入 */

process.stdin.resume();

/* 将终端输入数据发送给服务器 */

process.stdin.on("data", function(data){

  socketClient.write(data);

});

/* 客户端退出 */

process.on("exit", function(){

  process.stdout.write("client exit\r\n");

});

/* 按下ctrl+c 组合键退出的时候,发送退出事件 */

process.on("SIGINT", function(){

  process.exit(1);

});

 

以上算是对nodejs的socket通信的一个练习吧,先写到这吧。

 

 

 

 

posted @ 2013-11-20 01:22  JiangWang  阅读(935)  评论(0编辑  收藏  举报