如何实现请求-使用套接字的响应逻辑

时间:2019-06-27 15:45:21

标签: node.js sockets

HTTP HttpRequest(json) .then(结果=> console.log(结果)) .catch(错误=> console.error(错误))

但是,如果您使用套接字

socket.send(json)-一个地方的代码

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

我想这样做: socketRequest(json) .then(结果=> console.log(结果)) .catch(错误=> console.error(错误))

这完全是关于socketRequest模块的编程)

1 个答案:

答案 0 :(得分:0)

这完全取决于您的协议设计。

套接字被设计为模拟串行接口的工作方式-数据一次输入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));
    });
}