(この記事は JavaScript の Advent Calendar 2025 の記事【3つ目】です)
はじめに
今回の内容は、以前(4年前くらい)も扱ったことのある Node.js を使った TCP と UDP の通信の話です。久しぶりに、これらの実装を試してみます。
UDP を試す
まずは、UDP からです。エコーサーバーと、クライアントをそれぞれシンプルに作ります。
サーバー側(UDP)
まずは UDP のエコーサーバーで、Node.js 標準の「dgram(以下のもの)」を用いています。
●UDP/datagram sockets | Node.js Documentation
https://nodejs.org/api/dgram.html
import { createSocket } from "dgram";
const PORT = 5002;
const server = createSocket("udp4");
server.on("listening", () => {
const { address, port } = server.address();
console.log(`UDP server listening on ${address}:${port}`);
});
server.on("message", (msg, { address, port }) => {
console.log(`received: ${msg} from ${address}:${port}`);
server.send(`echo: ${msg}`, port, address, (err) => {
if (err) console.error("send error:", err);
});
});
server.on("error", (err) => {
console.error("Server error:", err);
server.close();
});
server.bind(PORT);
これを立ち上げた状態で、この後のクライアントを動かします。
クライアント側(UDP)
以下は、UDP のクライアントです。
「データを一回送って終了」というシンプルな処理を実装したものす。これを実行したところ、データを問題なく送信できることを確認できました。
import { createSocket } from "dgram";
const UDP_PORT = 5002;
const HOST = "localhost";
const client = createSocket("udp4");
client.send("テスト(UDP)", UDP_PORT, HOST, (err) => {
if (err) {
console.error(`送信エラー: ${err.message}`);
client.close();
}
});
client.on("message", (msg) => {
console.log(`受信: ${msg}`);
client.close();
});
client.on("error", (err) => {
console.error(`クライアントエラー: ${err.message}`);
client.close();
});
TCP を試す
次に TCP です。こちらも、エコーサーバーとクライアントをそれぞれシンプルに作ります。
サーバー側(TCP)
UDP の時と同様、Node.js標準の機能を使ってエコーサーバーを実装します。
import { createServer } from "net";
const PORT = 5001;
const server = createServer((socket) => {
const { remoteAddress, remotePort } = socket;
console.log(`client connected: ${remoteAddress}:${remotePort}`);
socket.on("data", (data) => {
console.log(`received: ${data}`);
socket.write(`echo: ${data}`);
});
socket.on("end", () => {
console.log("client disconnected");
});
socket.on("error", (err) => {
console.error(`socket error: ${err.message}`);
});
});
server.on("error", (err) => {
console.error(`server error: ${err.message}`);
});
server.listen(PORT, () => {
console.log(`TCP server listening on port ${PORT}`);
});
これを立ち上げた状態で、クライアントのほうも動かします。
クライアント側(TCP)
TCP のクライアントは、以下のとおりです。先ほどのサーバーと合わせて使ってみて、問題なく通信できることを確認できました。
import { createConnection } from "net";
const TCP_PORT = 5001;
const HOST = "localhost";
const client = createConnection(TCP_PORT, HOST, () => {
console.log("サーバーに接続");
client.write("テスト(TCP)");
});
client.on("data", (data) => {
console.log(`受信: ${data}`);
client.end();
});
client.on("end", () => {
console.log("切断");
});
client.on("error", (err) => {
console.error(`接続エラー: ${err.message}`);
});
サーバー側を 1つにまとめてみる(TCP と UDP の両方)
最後は、サーバー側を TCP と UDP の両方を扱えるようにしてみました。
import { createServer } from "net";
import { createSocket } from "dgram";
const TCP_PORT = 5001;
const UDP_PORT = 5002;
// TCP エコーサーバー
const tcpServer = createServer((socket) => {
const { remoteAddress, remotePort } = socket;
console.log(`[TCP] クライアント接続: ${remoteAddress}:${remotePort}`);
socket.on("data", (data) => {
console.log(`[TCP] 受信: ${data.toString().trim()}`);
socket.write(data);
});
socket.on("end", () => {
console.log("[TCP] クライアント切断");
});
socket.on("error", (err) => {
console.error(`[TCP] ソケットエラー: ${err.message}`);
});
});
tcpServer.on("error", (err) => {
console.error(`[TCP] サーバーエラー: ${err.message}`);
});
tcpServer.listen(TCP_PORT, () => {
console.log(`[TCP] Echo Server: port ${TCP_PORT}`);
});
// UDP エコーサーバー
const udpServer = createSocket("udp4");
udpServer.on("message", (msg, { address, port }) => {
console.log(`[UDP] 受信: ${msg} from ${address}:${port}`);
udpServer.send(msg, port, address);
});
udpServer.on("error", (err) => {
console.error(`[UDP] サーバーエラー: ${err.message}`);
udpServer.close();
});
udpServer.bind(UDP_PORT, () => {
console.log(`[UDP] Echo Server: port ${UDP_PORT}`);
});
上記サーバーを起動し、先ほど使っていた TCP と UDP のクライアントを組み合わせて動作確認を行いました。これも、問題なく動作することを確認できました。
