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

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

大概要实现的逻辑如下:

  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());
        }
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,851评论 6 13
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,442评论 11 349
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,687评论 0 6
  • 20170728打卡 题目是行为经济学的昵称。狭义而言,行为经济学是心理学与经济分析相结合的产物。当商家掌握了人们...
    苏芮阳阅读 1,911评论 7 4