zoukankan      html  css  js  c++  java
  • 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 ");

    });

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

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

      process.exit(1);

    });

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

  • 相关阅读:
    求相同号码一天内的上网流量——mapreduce
    scala初学
    对web日志文件实现按照人员、行为分类
    08 ROS阶段总结——package.xml 和 CMakeLists.txt 详细解读
    06 ROS中的节点、话题和服务
    07 ROS 的常见消息类型
    01 ROS下的三维点云数据处理(一)点云数据来源
    01 Opencv系列(一)ROS和opencv图像数据的转换
    01 ROS的运行架构——环境变量和工作空间
    02 Opencv系列(二)ROS框架下的摄像头调用方法
  • 原文地址:https://www.cnblogs.com/jiangwang2013/p/3432600.html
Copyright © 2011-2022 走看看