HTTP HttpRequest(json) .then(结果=> console.log(结果)) .catch(错误=> console.error(错误))
但是,如果您使用套接字
socket.send(json)-一个地方的代码
socket.on(消息)-代码中的其他地方
我想这样做: socketRequest(json) .then(结果=> console.log(结果)) .catch(错误=> console.error(错误))
这完全是关于socketRequest模块的编程)
答案 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));
});
}