• 用NodeJS创建一个聊天服务器


    Node 是专注于创建网络应用的,网络应用就需要许多I/O(输入/输出)操作。让我们用Node实现有多么简单,并且还能轻松扩展。

    创建一个TCP服务器

    var net = require('net');
    var chatServer = net.createServer();
    
    chatServer.on("connection", function(client) {
        client.write('Hi!
    ');
        client.on('data', function(data) {
            console.log(data);
    
        });
    
    });
    chatServer.listen(9000);

    我们用Telnet 连接上localhost:9000,向服务器发送hi,Node显示出一堆二进制的数据,原来Javascript无法很好的处理的二进制数据,所以引入Buffer库来处理。

    客户端互相发送消息

    var net = require('net');
    var chatServer = net.createServer();
    clientList = [];
    chatServer.on("connection", function(client) {
        client.write('Hi!
    ');
        client.name = client.remoteAddress + ":" + client.remotePort;
        client.write('Hi' + client.name + '
    ');
        clientList.push(client);
        client.on('data', function(data) {
            broadcast(data, client);
        });
    
    });
    
    function broadcast(msg, client) {
        for (var i = 0, clen = clientList.length; i < clen; i++) {
            if (client !== clientList[i]) {
                clientList[i].write(client.name + " says " + msg + "
    ");
            }
    
        }
    }
    chatServer.listen(9000);

    当我们断开其中的一个客户端的话,服务器会报如下错误:

    检查socket可写状态将程序变得更健壮

    var net = require('net');
    var chatServer = net.createServer();
    clientList = [];
    chatServer.on("connection", function(client) {
        client.write('Hi!
    ');
        client.name = client.remoteAddress + ":" + client.remotePort;
        client.write('Hi' + client.name + '
    ');
        clientList.push(client);
        client.on('data', function(data) {
            broadcast(data, client);
        });
        //客户端退出
        client.on('end', function() {
            console.log(client.name + " quit");
            clientList.splice(clientList.indexOf(client), 1);
        });
    
    });
    
    function broadcast(msg, client) {
        var cleanup = [];
        for (var i = 0, clen = clientList.length; i < clen; i++) {
            if (client !== clientList[i]) {
                //检查socket是否可写
                if (clientList[i].writable) {
                    clientList[i].write(client.name + " says " + msg + "
    ");
                } else {
                    cleanup.push(clientList[i]);
                    clientList[i].destroy(); //对断开连接的socket进行销毁
                }
            }
        }
        //在写入循环中删除死节点,消除垃圾索引
        for (var i = 0, clenuplen = cleanup.length; i < clenuplen; i++) {
            clientList.splice(clientList.indexOf(cleanup[i]), 1);
        }
    }
    chatServer.listen(9000);

    记录错误日志

     //记录错误日志
        client.on('error', function(e) {
            console.log(e);
        })

    为client对象添加error事件后,客户端发生的任何错误都会被记录下来。

  • 相关阅读:
    NET VBCSCompiler.exe占用100%,造成项目卡顿的的解决方法
    C#导出word [无规则表结构+模板遇到的坑]
    mysql允许远程连接的命令
    bootstrap-table的一些基本使用及表内编辑的实现
    在 VS2015+EF6.0中使用Mysql 遇到的坑
    NET使用SuperSocket完成TCP/IP通信
    GRPC在NET上的应用
    NET SignaiR 实现消息的推送,并使用Push.js实现通知
    运维自动化之4
    运维自动化之3
  • 原文地址:https://www.cnblogs.com/meiyh/p/6531864.html
Copyright © 2020-2023  润新知