基幹系システムではあまり出番がないので触っていなかった双方向通信の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を返すように設定
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で受信を待ち受ける。
<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をサポートしているようだが使った事がない。