とほほのWebSocket入門

目次

WebSocketとは

サンプル(ws)

Node.jsws を用いたサンプルを作成します。まず npmws をインストールします。

$ sudo npm install ws

サーバプログラム(chat-ws.js)を次のように作成します。

var server = require("ws").Server;
var s = new server({port:5000});
s.on("connection", (ws) => {
 ws.on("message", (msg) => {
 console.log("Recv: " + msg);
 s.clients.forEach((client) => {
 console.log("Send: " + msg);
 client.send(msg.toString());
 });
 });
 ws.on("close", () => {
 console.log("Closed.");
 });
});

node コマンドで実行します。

$ node chat-ws.js

クライアントプログラムを下記の様に作成し、ブラウザで表示します。ws://127.0.0.1:5000/ は適切なサーバアドレスに書き換えてください。

<pre id="out"></pre>
<input type="text" id="msg">
<input type="button" id="btn" value="OK">
<script>
var out = document.getElementById("out");
var msg = document.getElementById("msg");
var btn = document.getElementById("btn");
var sock = new WebSocket("ws://127.0.0.1:5000/");
sock.addEventListener("open", (e) => {
 console.log("Connected.");
});
sock.addEventListener("close", (e) => {
 console.log("Closed.");
});
sock.addEventListener("error", (e) => {
 console.log("Error.");
});
sock.addEventListener("message", (e) => {
 out.innerText += e.data + "\n";
 msg.value = "";
 msg.focus();
});
btn.addEventListener("click", (e) => {
 sock.send(msg.value); 
});
msg.focus();
</script>

入力欄のテキストを送信し、入力欄の上部に表示されれば成功です。複数のブラウザでアクセスすると、各々のブラウザ画面にメッセージを一斉配信することができます。

サンプル(Socket.IO)

同様のものを、Node.js, express, Socket.IO を用いたサンプルを示します。まず必要なパッケージをインストールします。

# npm install express
# npm install socket.io

サーバ側プログラムを chat-io.js として作成します。

const app = require("express")();
const http = require("http").createServer(app);
const io = require("socket.io")(http);
app.get("/", (req, res) => {
 res.sendFile(__dirname + "/index.html");
});
io.on("connection", (socket) => {
 console.log("Connected.");
 socket.on("post_message", (msg) => {
 io.emit("recv_message", msg);
 });
});
http.listen(5000, () => {
 console.log("Listen start.");
});

クライアント側を index.html として chat-io.js と同じフォルダに置きます。

<!doctype html>
<html lang="ja">
<head>
<title>Socket.IO chat</title>
<script src="https://cdn.socket.io/4.4.1/socket.io.min.js"
 integrity="sha384-fKnu0iswBIqkjxrhQCTZ7qlLHOFEgNkRmK2vaO/LbTZSXdJfAu6ewRBdwHPhBo/H"
 crossorigin="anonymous"></script>
</head>
<body>
<pre id="out"></pre>
<input type="text" id="msg">
<input type="button" id="btn" value="OK">
<script>
var out = document.getElementById("out");
var msg = document.getElementById("msg");
var btn = document.getElementById("btn");
var socket = io();
btn.addEventListener("click", (e) => {
 socket.emit("post_message", msg.value);
});
socket.on("recv_message", (message) => {
 out.innerText += message + "\n";
 msg.value = "";
 msg.focus();
});
</script>
</body>
</html>

下記の様に起動します。

$ node chat-io.js

ブラウザから http://(サーバアドレス):5000/ にアクセスし、入力欄に記入した文字列を送受信できれば成功です。

ws と Socket.IO の違い


Copyright (C) 2022 杜甫々
初版:2022年1月23日 最終更新:2019年1月23日
https://www.tohoho-web.com/ex/websocket.html

AltStyle によって変換されたページ (->オリジナル) /