Harjutus 11: Vestlusruum serveri ja klientrakenduse vahelHarjutus 11

Mine “allikate reposid”

Mine “mkdir Vestruum”

Kirjuta npm init

Seejärel installige ws

Avage node.js

index.js

const http = require("http")
const fs = require("fs")
const ws = new require("ws")

const wss = 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)) {
            wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onSocketConnect);
        }
        else if (req.url === "/") { //index.html
            fs.createReadStream("./index.html").pipe(res);
        }
        else {
            res.writeHead(404);
            res.end();
        }
}

const clients = new Set();

function onSocketConnect(ws) {
    clients.add(ws);
    ws.on("message", function(message) {
        message = message.slice(0, 50); // maksimaalne pikkus on 50
        for(let client of clients) {client.send(message);}
    })

    ws.on('close', function() {
        console.log("connection closed");
        clients.delete(ws);
    })
}

let log;
if(!module["parent"]){
    log = console.log;
    http.createServer(accept).listen(8080);
} else {
    log = function() {};
    exports.accept = accept;
}

index.html

<!doctype html>
<form name="publish">
    <input type="text" name="message" maxlength="50" />
    <input type="submit" value="Send" />
</form>

<div id="messages"></div>

<script>
    // Määrame WebSocket'i URL vastavalt keskkonnale
    let url = location.host === 'localhost' ?
        'ws://localhost:8080/ws' :
        location.host === 'javascript.local' ?
            'ws://javascript.local/article/websocket/chat/ws' :  
            // arenduskeskkond
            'wss://javascript.info/article/websocket/chat/ws';   
            // tootmiskeskkond

    // Loome WebSocket'i ühenduse
    let socket = new WebSocket(url);

    // Vormi saatmise sündmuse töötleja
    document.forms.publish.onsubmit = function() {
        let outgoingMessage = this.message.value;
        socket.send(outgoingMessage);  
        // Saadame sõnumi serverile
        return false;                  
        // Takistame lehe uuesti laadimist
    };

    // Sissetulevate sõnumite töötlemine
    socket.onmessage = function(event) {
        let incomingMessage = event.data;
        showMessage(incomingMessage);
    };

    // Kui ühendus suletakse, logime selle koodi
    socket.onclose = event => console.log(`Closed ${event.code}`);

    // Funktsioon sõnumite kuvamiseks #messages elemendis
    function showMessage(message) {
        let messageElem = document.createElement('div');
        messageElem.textContent = message;
        document.getElementById('messages').prepend(messageElem);
    }
</script>