zoukankan      html  css  js  c++  java
  • 用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事件后,客户端发生的任何错误都会被记录下来。

  • 相关阅读:
    MGR
    复制参数优化
    mysql复制
    sysbench
    mysql 用户及权限
    MySQL多实例安装
    PHP常用数组函数
    AJAX传递数据的两种编码x-www-form-urlencoded与json的区别
    使用PHP操作文件
    var_dump和var_export区别
  • 原文地址:https://www.cnblogs.com/meiyh/p/6531864.html
Copyright © 2011-2022 走看看