美文网首页
客户端的动态线路选择问题

客户端的动态线路选择问题

作者: 环零弦 | 来源:发表于2017-08-02 13:36 被阅读0次

客户端的动态线路选择问题

大概要实现的逻辑如下:

  1. 读配置文件,得到服务器列表。
  2. 向列表中的服务器均发送请求。
  3. 在获得第一个请求响应后,终端其它连接,当前响应主机IP即为选出的主机IP。
  4. 在程序运行过程中,如果当选主机连接不可以,重复选举过程,重新选举主机。
  5. 如果所有主机都不可用,程序退出。

主请求体如下:

let superRequest = (hostname, path, onResponse, onError, ext_data) => {
let superOption = {
    hostname: hostname,
    port: '443',
    path: path,
    method: 'GET',
    rejectUnauthorized: false,
    requestCert: true,
    headers: {
      'Accept-Encoding': 'gzip, deflate'
    }
  };
const req = https.request(superOption, (res) => {
});
req.write('');
if (ext_data.req_type === REQFORJSON) {
    global_params.connect_server_request_array.push(req);
}
  req.on('response', (response) => (onResponse(response, req, ext_data))).on('error', (e) => (onError(e, req, ext_data))).end();
};

主请求体的回调函数如下:

let onChcpJsonResponse = (response, req, ext_data) => {
    while (global_params.connect_server_request_array.length > 0) {
        let local_req = global_params.connect_server_request_array.pop();
        if (local_req !== req) {
            local_req.abort();
        }
    }
    if (global_params.connect_server_return_flag) {
        global_params.connect_server_return_flag = false;
        global_params.final_elected_url = ext_data.server_url;
        console.log('Elected url:' + global_params.final_elected_url);
        let body = '';
        if (response.headers['content-encoding'] === undefined) {
            response.on('data', data => {
                body += data;
            });
            response.on('end', () => {
                onChcpJsonResponseOnEnd(req, body)
            });
            response.on('error', e => {
                console.log('error' + e.toString());
                req.end();
            });
        } else {
            switch (response.headers['content-encoding']) {
                case 'gzip':
                    let gunzip = zlib.createGunzip();
                    response.pipe(gunzip);
                    gunzip.on('data', data => {
                        body += data;
                    });
                    gunzip.on('end', () => {
                        onChcpJsonResponseOnEnd(req, body)
                    });
                    gunzip.on('error', e => {
                        console.log('error' + e.toString());
                        req.end();
                    });
                    break;
                    default:
                    req.end();
            }
        }
    }
};

如果所有主机不可达,逻辑如下:

let onChcpJsonError = (e, req, ext_data) => {
    if (ext_data.server_url === global_params.final_elected_url) {
        global_params.final_elected_url = '';
        getRemoteChcpJson();
    } else {
        console.error("Host: " + ext_data.server_url + " request aborted or unreachable!");
        if (++global_params.connect_server_attempt_count >= update_files_content.local_json_content.server_urls.length) {
            global_params.connect_server_attempt_count = 0;
            global_params.final_elected_url = '';
            const options = {
                type: 'error',
                title: '更新',
                message: "与服务器连接丢失,程序即将关闭!",
                buttons: ['确定'],
            };
            dialog.showMessageBox(options, () => app.quit());
        }
    }
};

相关文章

  • 客户端的动态线路选择问题

    客户端的动态线路选择问题 大概要实现的逻辑如下: 读配置文件,得到服务器列表。 向列表中的服务器均发送请求。 在获...

  • 传奇服务器租用要注意哪些东西

    网络带宽线路 需要保证资源的下载速度,网络通畅。由于现在用户全国方位的都有,建议使用BGP动态线路,自动选择优化节...

  • 第8章 工厂方法模式

    简单工厂模式 简单工厂模式的优点: 工程类中包含了必要的判断逻辑,根据客户端的选择条件动态实例化类,对于客户端来说...

  • 几个常见的ftp错误问题及解决办法

    1、无法上传网页,提示“无法连接服务器”错误; 原因:FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问...

  • 【设计模式】工厂方法模式

    概念 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来...

  • 工厂模式

    重要概念 简单工厂模式的最大优点在于工厂类中包含了必要的逻辑,根据客户端的选择条件动态实例化相关类,对客户端来说,...

  • Android/iOS跨平台技术比较

    对客户端而言,跨平台技术在持续发展。 如果对动态更新的需求比较高,可以选择ReactNative Weex等框架。...

  • dubbo zookeeper 客户端

    两个zookeeper客户端选择 curator (默认) I0Itec (通过配置文件指定) 动态生成代理类 c...

  • 数据交换技术

    交换的概念 在多节点通信网络中,为有效利用通信设备和线路,一般希望动态地设定通信双方间的线路,动态地接通或断开通信...

  • 从移动端的配置说起

    出了什么问题 大多数客户端都有远程配置的功能和需求,项目规模由小到大以后,对客户端动态配置的需求就会迅速增加。就会...

网友评论

      本文标题:客户端的动态线路选择问题

      本文链接:https://www.haomeiwen.com/subject/puielxtx.html