[英]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.