簡體   English   中英

如何實現請求-使用套接字的響應邏輯

[英]How to implement Request – response logic using socket

HTTP HttpRequest(json).then(結果=> console.log(結果)).catch(錯誤=> console.error(錯誤))

但是,如果您使用套接字

socket.send(json)-一個地方的代碼

socket.on(消息)-代碼中的其他地方

我想這樣做:socketRequest(json).then(result => console.log(result)).catch(error => console.error(error))

全部與對socketRequest模塊進行編程有關)

這一切都與您的協議設計有關。

套接字被設計為模擬串行接口的工作方式-數據一次輸入8位,而其他...。 套接字沒有消息的概念,只有字節。 將插座視為USB鍵盤。 當用戶一次鍵入一個字母時,您的軟件僅獲得字節(有時,如果用戶鍵入得足夠快或按住某個鍵,則您的軟件將獲得字節組)。 您需要確定什么構成“數據包”。 一句話? 然后,您的軟件應檢測到句號"." 一條線? 然后,您檢測到換行符。

以下是HTTP 1.0客戶端的一個簡單示例(主要區別是HTTP 1.0通過關閉連接而HTTP 1.1發送Content-Length標頭來表示分組結束):

function HTTP_1_0_client (url) {
    let urlParts = url.match(/http:..([^/]+)(.*)/);
    let domain = urlParts[1];
    let path = urlParts[2];

    return new Promise((resolve, reject) => {
        let rawString = '';

        const client = net.createConnection(80, domain);
        client.write('GET ' + path + ' HTTP/1.0\n\n');
        client.on('data', buf => rawString += buf.toString());
        client.on('end', () => {
            // headers and body are separated by two newlines:
            let httpParts = rawString.match(/^(.+)\r?\n\r?\n(.*)/);
            let headers = httpParts[1].split(/\r?\n/);
            let text = httpParts[2];

            // first line of response is the status line:
            let statusLine = headers.shift();
            let status = statusLine.match(/^[0-9]+/)[0];

            // return the response to the promise:
            resolve({
                status: status,
                headers: headers,
                responseText: text
            });
        });
        client.on('error', err => reject(err));
    });
}

在上述協議中,我們僅將套接字連接用作數據包的末尾,即響應的末尾。 您可以使用其他條件來檢測響應周期的結束並返回響應。 這完全取決於協議設計。

以下是另一種簡單的協議,僅使用JSON格式定義數據包:

function JSONclient (host, port, requestData) {
    return new Promise((resolve, reject) => {
        let rawString = '';

        const client = net.createConnection(port, host);
        client.write(JSON.stringify(requestData));
        client.on('data', buf => {
            rawString += buf.toString();

            try {
                let response = JSON.parse(rawString);

                // If we get here it means no errors
                // which means packet is complete -
                // return response to promise:
                resolve(response);

                client.destroy(); // close connection
            }
            catch (err) {
                // Ignore parse error
                // It just means packet isn't complete yet.
            }
        });
        client.on('error', err => reject(err));
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM