【ITニュース解説】Create a simple TCP server with Node.js
2025年10月05日に「Dev.to」が公開したITニュース「Create a simple TCP server with Node.js」について初心者にもわかりやすく解説しています。
ITニュース概要
Node.jsで、相互にデータ通信するシンプルなTCPサーバーとクライアントの作成方法を解説する。クライアントがサーバーへメッセージを送信し、サーバーがそれに応答する基本的な仕組みをコード例とともに示す。
ITニュース解説
このニュース記事は、Node.jsを使って非常に基本的なTCPサーバーとクライアントを構築する方法を、実際のコードを交えて解説している。TCP(Transmission Control Protocol)は、インターネット上でデータを信頼性高くやり取りするための通信規約の一つで、ウェブブラウザでの閲覧やメールの送受信など、多くの場面で利用されている重要な技術である。Node.jsは、サーバーサイドでJavaScriptというプログラミング言語を実行するための環境であり、ネットワークを介したアプリケーションの開発によく用いられる。
まず、サーバー側のコード(src/server.ts)を見ていこう。サーバーの役割は、クライアントからの接続を待ち受け、接続が確立されたらクライアントとデータをやり取りすることにある。このコードでは、Node.jsに標準で組み込まれているnetモジュールを利用している。netモジュールは、TCP通信を扱うための様々な機能を提供している。
runServer()というメソッドの中で、net.createServer()という関数を呼び出し、新しいTCPサーバーのインスタンスを作成している。このcreateServer()関数には、クライアントがサーバーに接続してきたときに実行される特定の処理(「コールバック関数」と呼ばれる)を渡す。このコールバック関数が呼び出される際には、接続してきた個々のクライアントとの通信を管理するためのsocketというオブジェクトが引数として提供される。このsocketオブジェクトは、特定のクライアントとの通信経路そのものだと理解できる。
クライアントがサーバーに接続すると、console.log("TCP Server: Client connected:", socket.remoteAddress);という行によって、接続してきたクライアントのIPアドレスがコンソールに表示される。
次に、socket.on("data", (data) => { ... });という部分が重要だ。これは、「クライアントからデータが送られてきたら」というイベントを監視する設定である。クライアントからデータが届くと、このカッコで囲まれた処理が実行される。受信したデータはdata変数に格納されるが、これは生データなので、data.toString()を使って人間が読める文字列に変換される。サーバーは、この受信したデータをコンソールに表示した後、socket.write("Hello client! I got your message: " + data.toString());という行で、受け取ったメッセージを返信としてクライアントに送り返している。
また、socket.on("close", () => console.log("TCP Server: Client disconnected"));という行は、クライアントがサーバーから切断されたときに、「TCP Server: Client disconnected」というメッセージをコンソールに出力するように設定している。
サーバーの準備が整ったら、server.listen(4000, "127.0.0.1", () => { ... });という命令で、実際にクライアントからの接続待ち受けを開始する。ここで指定されている4000はポート番号と呼ばれ、コンピュータ上で特定のアプリケーションを識別するために使われる数値だ。"127.0.0.1"は「localhost」とも呼ばれ、自分のコンピュータ自身を指す特別なIPアドレスである。つまり、このサーバーは自分のコンピュータの4000番ポートで、クライアントからの接続を待機していることになる。待ち受けが正常に開始されると、「TCP Server: Server listening on 127.0.0.1:4000」というメッセージがコンソールに表示される。
次に、クライアント側のコード(src/client.ts)を見てみよう。クライアントは、サーバーに対して能動的に接続を確立し、データを送受信する役割を担う。サーバーと同様に、クライアントもnetモジュールを利用する。
runClient()メソッドの中で、net.createConnection({ host: "127.0.0.1", port: 4000}, () => { ... });という関数を呼び出し、サーバーへの接続を試みている。ここで指定するhostとportは、サーバーが待ち受けているIPアドレスとポート番号と完全に一致させる必要がある。接続が成功すると、その後のコールバック関数が実行され、"TCP Client: Connected to server"というメッセージがコンソールに表示される。接続が確立されたら、client.write("Hello server! This is Client!");という行によって、サーバーに最初のメッセージを送信している。
クライアントもサーバーと同様に、特定のイベントを監視する。client.on("data", (data) => { ... });は、サーバーからデータが送られてきたときの処理を定義している。サーバーからのメッセージを受け取ると、それを文字列に変換してコンソールに表示する。メッセージを受信した後、client.end();という行で、クライアントは自らサーバーとの接続を終了する。client.on("end", () => console.log("TCP Client: disconnected from server"));は、接続が終了したときに「TCP Client: disconnected from server」というメッセージをコンソールに出力するように設定されている。
最後に、src/main.tsは、このサーバーとクライアントのプログラム全体を実行するための起点となるファイルだ。MainクラスのstartServer()メソッドでサーバーのインスタンスを作成し、runServer()を呼び出してサーバーを起動する。同様に、startClient()メソッドでクライアントのインスタンスを作成し、runClient()を呼び出してクライアントを起動する。このmain.tsのコードが実行されると、まずサーバーが起動して接続を待ち、次にクライアントが起動してそのサーバーに接続し、メッセージの交換が行われた後、クライアントが接続を終了するという、一連の通信処理が自動的に実行されるようになっている。
このように、Node.jsのnetモジュールを活用することで、比較的少ないコード量で、サーバーとクライアントの間で信頼性の高いTCP通信を実装できる。これは、ネットワークプログラミングの基本的な動作を理解する上で非常に良い実践例であり、ここからさらに複雑な機能を持つネットワークアプリケーションやサービスへと発展させていくための土台となる知識である。