JavaScript socket
最后修改于 2023 年 10 月 18 日
在本文中,我们将展示如何在 JavaScript 中使用 socket。
在编程中,套接字 是在网络上运行的两个程序之间通信的端点。套接字用于在客户端程序和服务器程序之间创建连接。
Sockets API 在 Node.js 的 net 模块中可用。
JS socket HEAD 请求
HEAD 请求是一种 HTTP GET 请求,但不包含消息正文。请求/响应的头部包含元数据,例如 HTTP 协议版本或内容类型。
var net = require('net');
var host = 'webcode.me';
var port = 80;
var socket = new net.Socket();
socket.connect(port, host, () => {
socket.write("HEAD / HTTP/1.0\r\n");
socket.write("Host: webcode.me\r\n");
socket.write("User-Agent: Node.js HTTP client\r\n");
socket.write("Accept: text/html\r\n");
socket.write("Accept-Language: en-US\r\n");
socket.write("Connection: close\r\n\r\n");
});
socket.on('data', (data) => {
console.log(`${data}`);
socket.destroy();
});
HEAD 请求使用 HEAD 命令发出,后跟资源 URL 和 HTTP 协议版本。请注意,\r\n 是通信过程的强制性部分。详细信息在 RFC 7231 文档中描述。
client.on('data', (data) => {
console.log(`${data}`);
client.destroy();
});
$ nodejs head_req.js HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Wed, 10 Feb 2021 08:40:08 GMT Content-Type: text/html Content-Length: 348 Last-Modified: Sat, 20 Jul 2019 11:49:25 GMT Connection: close ETag: "5d32ffc5-15c" Accept-Ranges: bytes
JS socket GET 请求
HTTP GET 方法请求指定资源的表示。使用 GET 的请求应该只检索数据。
var net = require('net');
var host = 'webcode.me';
var port = 80;
var socket = new net.Socket();
socket.connect(port, host, () => {
socket.write('GET / HTTP/1.0\r\n\r\n');
});
socket.on('data', (data) => {
console.log(`${data}`);
socket.destroy();
});
该示例使用 GET 请求读取 webcode.me 的主页。它返回其标头及其正文。
socket.write('GET / HTTP/1.0\r\n\r\n');
我们将 GET 请求写入 socket。
$ nodejs get_req.js
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Wed, 10 Feb 2021 08:45:01 GMT
Content-Type: text/html
Content-Length: 348
Last-Modified: Sat, 20 Jul 2019 11:49:25 GMT
Connection: close
ETag: "5d32ffc5-15c"
Access-Control-Allow-Origin: *
Accept-Ranges: bytes
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My html page</title>
</head>
<body>
<p>
Today is a beautiful day. We go swimming and fishing.
</p>
<p>
Hello there. How are you?
</p>
</body>
</html>
JS socket QOTD
每日一句服务是一个有用的调试和测量工具。每日一句服务只是发送一条短消息,而不考虑输入。端口 17 预留给每日一句服务。
var net = require('net');
var host = 'djxmmx.net';
var port = 17;
var socket = new net.Socket();
socket.connect(port, host, function() {
socket.write('');
});
socket.on('data', (data) => {
console.log(`${data}`);
socket.destroy();
});
该示例创建了一个连接到 QOTD 服务的客户端程序。
socket.write('');
我们向套接字发送了一条空消息。
socket.on('data', (data) => {
console.log(`${data}`);
socket.destroy();
});
我们接收输出并关闭 socket。
$ nodejs qotd.js "The secret of being miserable is to have leisure to bother about whether you are happy or not. The cure for it is occupation." George Bernard Shaw (1856-1950)
JS socket 发送邮件
要通过套接字发送电子邮件,我们使用 SMTP 命令,例如 HELO、MAIL FROM 和 DATA。
let net = require('net');
let host = '192.168.0.23';
let port = 25;
let from = "john.doe@example.com";
let to = "root@core9";
let name = "John Doe";
let subject = "Hello";
let body = "Hello there";
let socket = new net.Socket();
socket.connect(port, host, () => {
socket.write("HELO core9\n");
socket.write(`MAIL FROM: <${from}>\n`);
socket.write(`RCPT TO: <${to}>\n`);
socket.write("DATA\n");
socket.write(`From:${name}\n`);
socket.write(`Subject:${subject}\n`);
socket.write(`${body}`);
socket.write("\r\n.\r\n");
socket.write("QUIT\n");
});
socket.on('data', data => {
console.log(`${data}`);
});
socket.on('close', () => {
socket.destroy();
});
该示例将电子邮件发送到本地网络上的计算机。
$ nodejs send_email.js 220 core9 ESMTP Sendmail 8.15.2/8.15.2; Thu, 11 Feb 2021 10:07:14 +0100 (CET) 250 core9 Hello spartan.local [192.168.0.20], pleased to meet you 250 2.1.0 <john.doe@example.com>... Sender ok 250 2.1.5 <root@core9>... Recipient ok 354 Enter mail, end with "." on a line by itself 250 2.0.0 11B97EKF001178 Message accepted for delivery 221 2.0.0 core9 closing connection
我们发送了电子邮件。
From john.doe@example.com Thu Feb 11 10:07:14 2021
Return-Path: <john.doe@example.com>
Received: from core9 (spartan.local [192.168.0.20])
by core9 (8.15.2/8.15.2) with SMTP id 11B97EKF001178
for <root@core9>; Thu, 11 Feb 2021 10:07:14 +0100 (CET)
(envelope-from john.doe@example.com)
Date: Thu, 11 Feb 2021 10:07:14 +0100 (CET)
Message-Id: <202102110907.11B97EKF001178@core9>
From:John.Doe
Subject:Hello
To: undisclosed-recipients:;
Status: RO
Hello there
我们在接收端检查了电子邮件。
JS socket 回显服务器
回显服务器是一个简单的服务器,可用于测试。它只是将消息发送回客户端。
var net = require('net');
var host = '0.0.0.0';
var port = 5050;
net.createServer(sock => {
console.log(`connected: ${sock.remoteAddress}:${sock.remotePort}`);
sock.on('data', (data) => {
console.log(`${sock.remoteAddress}: ${data}`);
sock.write(`${data}`);
});
sock.on('close', (data) => {
console.log(`connection closed: ${sock.remoteAddress}:${sock.remotePort}`);
});
}).listen(port, host);
console.log(`Server listening on ${host}:${port}`);
使用 createServer 函数创建一个新服务器。 listen 函数启动一个服务器,监听连接。
$ nodejs echo_server.js Server listening on 0.0.0.0:5050
我们启动服务器。
$ echo hello | nc localhost 5050 hello
使用 nc 工具,我们将消息发送到回显服务器。
来源
在本文中,我们已经使用了 JavaScript 中的 socket。