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 1 year has passed since last update.

Expressでsocket.ioを利用しWebSocket通信を実施する。

Posted at

#アジェンダ
①公式提供のソースコードの解析
②Roomを追加する

###①公式提供のソースコードの解析
リンクより、socketioのソースコードを取得し、実行する。

サーバ側のコード
const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html');
});

/** コネクション確立 */
io.on('connection', (socket) => {
  console.log('接続成功!!')
  socket.on('chat message', msg => {
    io.emit('chat message', msg);
    console.log('msg:'+msg)
  })
})

http.listen(port, () => {
  console.log(`Socket.IO server running at http://localhost:${port}/`);
});

クライアント側のコード
<!DOCTYPE html>
<html>
  <head>
    <title>Socket.IO chat</title>
    <style>
      body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; }

      #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); }
      #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; }
      #input:focus { outline: none; }
      #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; }

      #messages { list-style-type: none; margin: 0; padding: 0; }
      #messages > li { padding: 0.5rem 1rem; }
      #messages > li:nth-child(odd) { background: #efefef; }
    </style>
  </head>
  <body>
    <ul id="messages"></ul>
    <form id="form" action="">
      <input id="input" autocomplete="off" /><button>Send</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>

    <script>
      var socket = io();

      var messages = document.getElementById('messages');
      var form = document.getElementById('form');
      var input = document.getElementById('input');

      form.addEventListener('submit', function(e) {
        e.preventDefault();
        if (input.value) {
          socket.emit('chat message', input.value);
          input.value = '';
        }
      });

      socket.on('chat message', function(msg) {
        var item = document.createElement('li');
        item.textContent = msg;
        messages.appendChild(item);
        window.scrollTo(0, document.body.scrollHeight);
      });
    </script>
  </body>
</html>
サーバ側のコード
io.on('connection', (socket) => {
  console.log('接続成功!!')
  socket.on('chat message2', msg => {
    io.emit('chat message2', msg);
    console.log('msg:'+msg)
  })
})

io.onは何か。→コネクションの確立を表す(https://socket.io/docs/v4/server-api/#event-connection)

socket.onは何か。→ (eventName, callBack)イベント名chat message2に対しcallBack関数を実行する
(https://socket.io/docs/v4/server-api/#socketoneventname-callback)

io.emitは何か。→NameSpaceに対しmsgを送信する

###②Roomを追加する。
Node.jsはシングルスレッド処理。そのため一つのスレッドに対し複数のクライアントが接続するため、broadcast時全員に送信される仕組みとなる。これでは使い勝手が悪いので、Roomという概念がある。

Roomとは何か?
複数のユーザが入る環境の中で双方向のコミュニケーションを実施するようなもの。

あれ?そうするとNameSpaceとRoomの違いってなんだ????
よくわからない。。。Webで調べたところ、nameSpaceのなかにroomがあるらしい。

まあ、一旦色々勉強必要だけど、鋭意学んでいきます。

#参考
https://socket.io/docs/v4/server-api/

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?