Node.js rakenduse loomine
cd .\Vestlusruum\
npm init -y
npm install ws
Loome fail index.html
Kirjutame kood:
<!doctype html>
<form name="publish">
<input type="text" name="message" maxlength="50"/>
<input type="submit" value="Send"/>
</form>
<div id="messages"></div>
<script>
let url = location.host == 'localhost' ?
'ws://localhost:8080/ws' : location.host == 'javascript.local' ?
`ws://javascript.local/article/websocket/chat/ws` : // dev integration with local site
`wss://javascript.info/article/websocket/chat/ws`; // prod integration with javascript.info
//создаем объект с вебсокетом
let socket = new WebSocket(url);
// отправляем сообщение на форму
document.forms.publish.onsubmit = function() {
let outgoingMessage = this.message.value;
socket.send(outgoingMessage);
return false;
};
// обрабатываем входящие сообщения
socket.onmessage = function(event) {
let incomingMessage = event.data;
showMessage(incomingMessage);
};
//если пользователь закрыт сокет, то пишем об этом в консоли
socket.onclose = event => console.log(`Closed ${event.code}`);
// показываем сообщения в div#messages
function showMessage(message) {
let messageElem = document.createElement('div');
messageElem.textContent = message;
document.getElementById('messages').prepend(messageElem);
}
</script>
See HTML ja JavaScript kood loob vormi, mille kaudu kasutaja saab saata sõnumeid WebSocket-serverisse. Sõnumid kuvatakse veebilehelt div#messages
elemendis. Kui WebSocket-ühendus on suletud, siis kirjutatakse konsolisse sõnum. Serveri URL valitakse sõltuvalt keskkonnast: arenduses (localhost
või javascript.local
) kasutatakse ws://
, tootes aga turvaline wss://
.
Loome index.js
Kirjutame kood:
const http = require('http');
const fs = require('fs');
const ws = require('ws');
const wws = new ws.Server({ noServer: true });
function accept(req, res) {
if (req.url === '/ws' && req.headers.upgrade &&
req.headers.upgrade.toLowerCase() === 'websocket' &&
req.headers.connection.match(/\bupgrade\b/i)) {
wws.handleUpgrade(req, res.socket, Buffer.alloc(0), onSocketConnect);
} else if (req.url === '/') { // index.html
fs.createReadStream('./index.html').pipe(res);
} else {
res.writeHead(404);
res.end();
}
}
// Kliendi loomine
const clients = new Set();
// Ühenduse loomine
function onSocketConnect(ws) {
clients.add(ws);
ws.on('message', function(message) {
message = message.clice(0,50); //maksimaalne pikkus on 50 sümbolid
for(let client of clients) {client.send(message);}
});
ws.on('close', function() {
log('connection closed');
clients.delete(ws);
})
}
let log;
if(!module["parent"]) {
log = console.log;
http.createServer(accept).listen(8080);
} else {
// to embed into javascript.info
log = function() {};
// log = console.log;
exports.accept = accept;
}
See kood loob HTTP-serveri koos WebSocket-ühendusega, mis teenindab WebSocket-ühendusi aadressil /ws
ja saadab sõnumeid kõigile ühendatud klientidele. Kui külastatakse juurt (/
), tagastatakse fail index.html
. WebSocket-server piirab sõnumite pikkust 50 tähemärgiga ja eemaldab kliendi nimekirjast ühenduse sulgemisel.
Käivitame appi:
node index.js
