2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.js の標準機能でシンプルな TCP と UDP【JavaScript:3】

Posted at

(この記事は 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 のクライアントを組み合わせて動作確認を行いました。これも、問題なく動作することを確認できました。

2025-12-06_13-21-03.jpg

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?