zoukankan      html  css  js  c++  java
  • 用node.js创建一个聊天服务器

     

    1.node的安装,网上查看教程,很简单的。

    2.全部代码如下:

    //我们加载了 net 模块。这个模块包含了 Node 需要的所有 TCP 功能

    var net = require('net')
    var chatServer = net.createServer();
    clientList = [];
    // 链接事件在调用回调函数时,会传给我们新客户端所对应的TCP socket对象的引用。
    chatServer.on('connection', function(client) {
    //客户端的ip地址和客户端从服务器返回数据的TCP端口 9000
    client.name = client.remoteAddress + ':' + client.remotePort
    client.write('Hi ' + client.name + '! ');
    clientList.push(client);
    // client.on事件监听器
    client.on('data', function(data) {
    broadcast(data, client);
    });
    // 问题:当一个客户端断开链接的时候,其他的客户端也会下线。
    // 当一个客户端断开连接时,把它从客户端的列表中移除。
    client.on('end', function() {
    // indexOf()找到客户端在队列中的位置
    // 下一个客户端再调用broadcast方法的时候,已经断开的客户端就不会出现在列表中
    clientList.splice(clientList.indexOf(client), 1);
    });
    // 错误记录
    client.on('error', function(e) {
    console.log(e);
    });
    });

    // 实现多个客户端链接到服务器,进行通信,添加到队列中。
    // 改进版
    function broadcast(message, client) {
    for (var i = 0; i < clientList.length; i += 1) {
    var cleanup = [];
    if (client !== clientList[i]) {
    // 把数据发送给客户端
    // 打印出发送者的名字和内容,进行区分。
    // 因为闭包绑定了每个client对象和相应的请求。
    // 检查socket是否可写
    if (clientList[i].writable) {
    clientList[i].write(client.name + " says " + message);
    } else {
    cleanup.push(clientList[i]);
    clientList[i].destroy();
    }
    }
    }
    // 在写入循环中删除死节点,清除索引垃圾
    for (var i = 0; i < cleanup.length; i += 1) {
    clientList.splice(clientList.indexOf(cleanup[i], 1));
    }
    };

    //端口号
    chatServer.listen(9000);
     
    3.命令行操作
    启动服务:

    多个客户端进行链接服务器:打开多了命令行窗口cmd;

    链接服务器:

    如果无法使用telnet不是内部或外部命令,百度可以解决,http://jingyan.baidu.com/article/7908e85c6ec355af491ad265.html

    多个客户端通信的效果:

    仅供大家参考一下。

     

     

  • 相关阅读:
    316 Remove Duplicate Letters 去除重复字母
    315 Count of Smaller Numbers After Self 计算右侧小于当前元素的个数
    313 Super Ugly Number 超级丑数
    312 Burst Balloons 戳气球
    309 Best Time to Buy and Sell Stock with Cooldown 买股票的最佳时间含冷冻期
    Java 类成员的初始化顺序
    JavaScript 全局
    HTML字符实体
    Java中的toString()方法
    JavaScript 弹窗
  • 原文地址:https://www.cnblogs.com/zhengao/p/7524515.html
Copyright © 2011-2022 走看看