ZetCode

JavaScript socket

最后修改于 2023 年 10 月 18 日

在本文中,我们将展示如何在 JavaScript 中使用 socket。

在编程中,套接字 是在网络上运行的两个程序之间通信的端点。套接字用于在客户端程序和服务器程序之间创建连接。

Sockets API 在 Node.js 的 net 模块中可用。

注意: 在网络中,套接字一词有不同的含义。它用于 IP 地址和端口号的组合。

JS socket HEAD 请求

HEAD 请求是一种 HTTP GET 请求,但不包含消息正文。请求/响应的头部包含元数据,例如 HTTP 协议版本或内容类型。

head_req.js
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 的请求应该只检索数据。

get_req.js
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 预留给每日一句服务。

qotd.js
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。

send_mail.js
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 回显服务器

回显服务器是一个简单的服务器,可用于测试。它只是将消息发送回客户端。

echo_server.js
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 工具,我们将消息发送到回显服务器。

来源

Node.js net 参考

在本文中,我们已经使用了 JavaScript 中的 socket。

作者

我叫 Jan Bodnar,是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。