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

More than 3 years have passed since last update.

メモ:Node.js(http)でWebSocketを扱う

Posted at

基幹系システムではあまり出番がないので触っていなかった双方向通信のWebSocket
こことか
ここを参考にテスト

WindowsServer2012, Nodejsはv14.16でテスト

Node.js側

単純にWebSocketを使う場合は
npm install ws
でいけるが、Socket.ioを使う場合は
npm install socket.io
でインストールする。
今回はsocket.ioを選択

サーバ側ではexpressではなく通常のhttpを利用した。
server.onでclient.htmlを返すように設定

server.js
var fs = require('fs');
var http = require('http');
var server = http.createServer();

// HTTPのアクセス
server.on('request', function(req, res) {
  var stream = fs.createReadStream('client.html');
  res.writeHead(200, {'Content-Type': 'text/html'});
  stream.pipe(res);
});

// WebSocketのアクセス
var io = require('socket.io')(server);
io.on('connection', function(socket) {
    socket.on('chat',  function (data) {
      io.emit('chat',data);
      console.log(data);
    });
  });

server.listen(8000);

WebSocketではserverを指定してioを取得。
そのioに対してデータが飛んできた時の挙動を指定する。
今回はdataをそのまま返してやると同時にconsole.ogで出力するようにした。
(チャットのようなもの)

クライアントのスクリプト

実際にはサーバ側に置いているclient.htmlの内容

io.connect()でsocketを取得して、socket.emitでメッセージを送信する。
socket.onで受信を待ち受ける。

client.html
<html>
  <head>
    <title>Socket.IO</title>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      $(function() {
        var socket = io.connect();

        $('#send').on('click', function(event){
            var msg =  $('#txtfield').val();
            if(msg != ""){
                socket.emit('chat',msg);
                console.log(msg)
            }
        });

        socket.on('chat', function(data, fn) {
          $('#message').prepend(data + "<br>");
        });
      });
    </script>
  </head>
  <body>
    <h1>Socket.IO</h1>
    <hr>
    <input type="text" name="txtfield" id="txtfield" />
    <input type="button" name="send" value="send" id="send" />
    <hr>
    <div id="message"></div>
  </body> 
</html>

AWSのサーバレスでやるとしたらAPIGateway+Lambdaは回数課金だった気がするので向いてなさそう。Fargateでコンテナ利用する形なのかな。
GCPだとCloudRunがSocketsをサポートしているようだが使った事がない。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?