5
2

More than 1 year has passed since last update.

uWebSockets.js を使った Webサーバー・WebSocketサーバーのお試し【Node.js】

Last updated at Posted at 2022-03-13

以下の記事を書いた時に見かけた「uWebSockets」が気になって、情報を少し見てみたり、試してみたというものです。

●Socket.IO の最新版 4.x の情報を見てみる(2022年3月) - Qiita
 https://qiita.com/youtoy/items/c57158f4a08e478dff57

Socket.IO のドキュメント内での記載

Socket.IO のドキュメント内だと、具体的に以下の部分などで登場しています。

発見した元1
発見した元2

uWebSockets.js を試す

まず、uWebSockets.js の GitHubリポジトリを見てみます。

●uNetworking/uWebSockets.js: μWebSockets for Node.js back-ends
 https://github.com/uNetworking/uWebSockets.js
uWebSockets.js

以下が記事執筆時点での、公式ドキュメントの最新版のようです。
●uWebSockets.js v20.4.0 documentation
 https://unetworking.github.io/uWebSockets.js/generated/

利用するための準備

利用するためには、以下の yarnコマンドを使った準備が必要になるようです。
利用するための準備

具体的には、以下となります。

$ yarn add uWebSockets.js@uNetworking/uWebSockets.js#v20.3.0

お試しする時の参照先

実際に uWebSockets.js を試していく際に、参照元の情報として「examples」の中のいくつかの内容を見てみます。

この HelloWorld.js と WebSockets.js を試してみることにします。

HelloWorld.js を元にしたお試し

HelloWorld.js を元にしたお試しをやっていきます。
require の部分や uWS.App の部分などを少し変更して、以下の内容にしました。

const uWS = require('uWebSockets.js');
const port = 9001;

const app = uWS.App().get('/*', (res, req) => {
  res.end('Hello World!');
}).listen(port, (token) => {
  if (token) {
    console.log('Listening to port ' + port);
  } else {
    console.log('Failed to listen to port ' + port);
  }
});

上記のプログラムを nodeコマンドで実行してサーバーを立ち上げ、その後に、ブラウザで http://127.0.0.1:9001/ にアクセスしてみます。
無事に、サーバーからのレスポンスが返ってきているのが確認できました。
HelloWorld.jsを試した結果

WebSockets.js を元にしたお試し

次に WebSockets.js を元にしたお試しをやっていきます。
先ほどと同様に、これも少し書きかえをして使ってみます。

const uWS = require('uWebSockets.js');
const port = 9001;

const app = uWS.App().get('/*', (res, req) => {
  res.end('Hello World!');
}).ws('/*', {
  compression: uWS.SHARED_COMPRESSOR,
  maxPayloadLength: 16 * 1024 * 1024,
  idleTimeout: 12,
  open: (ws) => {
    console.log('A WebSocket connected!');
  },
  message: (ws, message, isBinary) => {
    let ok = ws.send(message, isBinary);
  },
  drain: (ws) => {
    console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
  },
  close: (ws, code, message) => {
    console.log('WebSocket closed');
  }
}).any('/*', (res, req) => {
  res.end('Nothing to see here!');
}).listen(port, (token) => {
  if (token) {
    console.log('Listening to port ' + port);
  } else {
    console.log('Failed to listen to port ' + port);
  }
});

また今後も上記のプログラムを nodeコマンドで実行してサーバーを立ち上げ、その後に、ブラウザで http://127.0.0.1:9001/ にアクセスしてみます。
今度も無事に、サーバーからのレスポンスが返ってきているのが確認できました。
HelloWorld.jsを試した結果

そして、今回は WebSocketサーバーも立ち上がっているので、以下の記事を書いた時と同じ方法で WebSocketクライアントを作成し、WebSocketによる通信を試します。

●Node.js のフレームワークの Fastify と WebSocket を利用可能にする fastify-websocket を軽く触ってみる - Qiita
 https://qiita.com/youtoy/items/7c5a318278e397602b76

上記の記事では HTMLファイルで WebSocketクライアントを用意していました。
そのポート番号の部分を今回のサーバーに合うように少し書きかえて、以下のファイルを用意しました。

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebSocketクライアント</title>
</head>

<body>
  <input type="button" id="button" value="データの送信">

  <script>
    const socket = new WebSocket('ws://127.0.0.1:9001');

    socket.addEventListener('open', function (event) {
      console.log('サーバーへの接続成功');
    });

    socket.addEventListener('message', function (event) {
      console.log('Message from server ', event.data);
    });

    const button = document.getElementById('button');
    button.addEventListener('click', function () {
      socket.send('hello from client');
    });
  </script>
</body>

</html>

上記の HTMLファイルをブラウザで開き、開発者ツールのコンソールを開いた状態で、ブラウザ上に表示されたボタンを押してみます。
その結果、以下のようにコンソールにサーバーから受信したデータ(クライアントから送ったデータがオウム返しされたもの)を表示することができました。
WebSocketサーバーを試した結果

おわりに

今回、uWebSockets.js を使った Webサーバー・WebSocketサーバーを試してみて、意図通りに動作させることができました。

今回は、とりあえず動作させてみるところまでやってみましたが、Node.js用の Webアプリ用フレームワークや、WebSocketサーバーを構築する仕組みは他にもあるため、それらとの違いを確認してみたいところです。

5
2
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
5
2