Harjutus 11: Vestlus ruum

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

Scroll to Top