LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2023で記事投稿!

【Node.js】Socket.IO / Express / TypeScriptでリアルタイム通信を実現するソケットサーバー構築

Last updated at Posted at 2023-06-17

こんにちは、yamaday0uです。

今回はNode.jsの環境でチャットなどのリアルタイム通信を実現するソケットサーバーを構築する例をご紹介します。

かなりシンプルな構成で作りますので、これからNode.jsでソケットサーバーを作ってみたい多くの方の参考になると思います。
※2022年から技術系の記事は個人ブログにも投稿しております。個人ブログの記事は適宜修正しておりますのでぜひこちらもご覧ください→yamaday0u Blog

プロジェクトの構成

プロジェクトの全容は以下のようになります。

.
├── client
│   └── index.ts // クライアント側のプログラム
├── server
│   └── index.ts // サーバー側のプログラム
├── node_modules
├── package-lock.json
└── package.json

この記事の内容はソケットサーバー構築がメインですが、動作確認用にクライアント側も作成します。

ここで紹介するプロジェクトはぼくのGithubリポジトリに公開しています。良かったらご覧ください。(随時更新しているのでこの記事の内容とは変わっている可能性があります。)

TypeScriptの採用理由

個人的に以前から触ってみたかったので、挑戦の意味も込めてTypeScriptでソケットサーバーを構築することにしました。

静的型付け言語ってかっこよくないですか?

ライブラリのインストール

まずは必要なライブラリのインストールをします。

インストールするのは以下のライブラリです。

  • typescript(typescriptでコードを書いていくため)
  • express(サーバーとして機能させるため)
  • socket.io(今回の主役ライブラリ)
  • socket.io-client(クライアント用)
  • ts-node(typescriptのままテスト実行するため)

ターミナルで以下のコマンドを実行します。

ターミナル
npm install typescript express socket.io socket.io-client ts-node
ターミナル
npm install -D @types/express @types/node

ソケットサーバーの構築

いよいよサーバーを構築します。

Socket.ioのドキュメントに記載されている例を参考にして、expressをhttpを組み合わせて作ります。

server/index.ts
import express from "express";
import { createServer } from "http";
import { Server } from "socket.io";

const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, { path: "/socket/" });

app.get("/", (req: express.Request, res: express.Response) => {
  res.json({
    message: "root path"
  });
});

io.on("connection", (socket) => {
  console.log("connected");
});

httpServer.listen(3000, () => {
  console.log("Chat server listening on port 3000");
});

サーバーを起動するためのコマンドのショートカット用スクリプトををpackege.jsonに追加します。

package.json
{
  "name": "socket-practice",
  "version": "1.0.0",
  "description": "",
  "main": "server/index.ts",
  "scripts": {
    "server": "ts-node server/index.ts" // 追加
  }, (以下省略)
}

サーバーを起動してみましょう!

ターミナル
npm run server

スクリーンショット 2023-06-14 0.53.14.png
無事にサーバーが起動できました。

クライアント側の構築

次はクライアント側を構築します。

client/indexts
import { io } from "socket.io-client";

const socket = io("http://localhost:3000", { path: "/socket/" });

socket.on("connect", () => {
  console.log("client connected");
});

先ほどと同じようにクライアントを実行するコマンドのショートカットスクリプトをpackage.jsonに追加します。

package.json
{
  "name": "socket-practice",
  "version": "1.0.0",
  "description": "",
  "main": "server/index.ts",
  "scripts": {
    "server": "ts-node server/index.ts",
    "client": "ts-node client/index.ts" // 追加
  }, (以下省略)
}

クライアントも起動してみましょう。

ターミナル
npm run client

スクリーンショット 2023-06-14 0.56.28.png
clientがserverとつながりました。
先に起動させておいたサーバーもクライアントとつながって、”connected”のログが出力されました!

スクリーンショット 2023-06-14 0.56.49.png
server側でもclientとつながりました

参考資料

0
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
0
0