PK u}XώΈ8‘& & server.js/** ΠΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ: > npm install ws ΠΠ°Π»Π΅Π΅: > node server.js > ΠΎΡΠΊΡΠΎΠΉΡΠ΅ http://localhost:8080 Π² Π²Π°ΡΠ΅ΠΌ Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ */ const http = require('http'); const fs = require('fs'); const ws = new require('ws'); const wss = new ws.Server({noServer: true}); const clients = new Set(); function accept(req, res) { if (req.url == '/ws' && req.headers.upgrade && req.headers.upgrade.toLowerCase() == 'websocket' && // ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½: keep-alive, Upgrade 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(); } } function onSocketConnect(ws) { clients.add(ws); log(`Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅`); ws.on('ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅', function(message) { log(`ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: ${message}`); message = message.slice(0, 50); // ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ Π΄Π»ΠΈΠ½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ 50 for(let client of clients) { client.send(message); } }); ws.on('Π·Π°ΠΊΡΡΡΡ', function() { log(`ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΡΡΡΠΎ`); clients.delete(ws); }); } let log; if (!module.parent) { log = console.log; http.createServer(accept).listen(8080); } else { // Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° javascript.info log = function() {}; // log = console.log; exports.accept = accept; }PK u}X!*$+γ γ index.html
PK u}XώΈ8‘& & server.jsPK u}X!*$+γ γ M index.htmlPK o X