Как в net.createServer реализовать событие upgrade?
Как я понял, http.createServer это некая надстройка над net.createServer в котором реализован дополнительный функционал из события net.createServer().on('data')
Как в net.createServer реализовать событие upgrade, которое есть у http.createServer?
Откуда брать данные для socket?
http.createServer.on('upgrade', (request, socket) => { ...} ) |
http.createServer.on('upgrade', (request, socket) => { ...} )
По умолчанию события socket.on('upgrade', (req, socket, head) ...) не оказалось и я пытался его воспроизвести, как мог
Зашел в небольшой тупик и не понял, откуда брать данные для соединений, т.к. во всех примерах его брали из upgrade, как аргумент
Просьба сильно на код не ругаться )
import net from 'net' import * as crypto from 'crypto' const server = net.createServer(function (socket) { console.log("connected") const HANDSHAKE_CONSTANT = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' const connections = new Set() // connections.add(socket) socket.on('data', function (data) { const request = data.toString() const headers = new Map() request.split('rn').map((item, i) => { if(!i) return const header = item.split(': ') headers.set(header[0], header[1]) }) const clientKey = headers.get('Sec-WebSocket-Key') const handshakeKey = crypto .createHash('sha1') .update(clientKey + HANDSHAKE_CONSTANT) .digest('base64'); const responseHeaders = [ 'HTTP/1.1 101', 'upgrade: websocket', 'connection: upgrade', `sec-webSocket-accept: ${handshakeKey}`, 'rn', ] socket.write(responseHeaders.join('rn')) // setTimeout(() => { // connections.forEach(socket => { // const message = Buffer.from('Hello WS') // const meta = Buffer.alloc(2) // meta[0] = 0x81 // meta[1] = message.length // socket.write(Buffer.concat([meta, message])) // }) // }, 1000) }) socket.on('upgrade', (req, socket, head) => { console.log({ head: req.headers }) }) }) |
import net from 'net' import * as crypto from 'crypto' const server = net.createServer(function (socket) { console.log("connected") const HANDSHAKE_CONSTANT = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' const connections = new Set() // connections.add(socket) socket.on('data', function (data) { const request = data.toString() const headers = new Map() request.split('rn').map((item, i) => { if(!i) return const header = item.split(': ') headers.set(header[0], header[1]) }) const clientKey = headers.get('Sec-WebSocket-Key') const handshakeKey = crypto .createHash('sha1') .update(clientKey + HANDSHAKE_CONSTANT) .digest('base64'); const responseHeaders = [ 'HTTP/1.1 101', 'upgrade: websocket', 'connection: upgrade', `sec-webSocket-accept: ${handshakeKey}`, 'rn', ] socket.write(responseHeaders.join('rn')) // setTimeout(() => { // connections.forEach(socket => { // const message = Buffer.from('Hello WS') // const meta = Buffer.alloc(2) // meta[0] = 0x81 // meta[1] = message.length // socket.write(Buffer.concat([meta, message])) // }) // }, 1000) }) socket.on('upgrade', (req, socket, head) => { console.log({ head: req.headers }) }) })
Дополнительно:
А зачем?
Вам вообще-то нужно реализовать парсинг http-запроса, что не очень тривиально и непонятно зачем это нужно если он уже реализован…
Собственно, ответ я вам уже давал в предыдущем вашем вопросе и он все тот же: согласно спецификациям протокола - там все очень детально расписано, что посылает клиент, что и когда отвечает сервер. Вы соответствующий раздел прочитали? Какая именно у вас с ним сложность?
- Я читал, но там все на словах и остался вопрос с реализацией объекта socket, как его воспроизвести на Node JS, как в этом примере, где мы его получаем в аргументах
socket.on('upgrade', (req, socket, head) => { ... })
socket.on('upgrade', (req, socket, head) => { ... })
- В смысле "все на словах"? Вообще-то это полные официальные спецификации протокола WebSocket. Там все четко и понятно расписано - что делает клиент, что делает сервер, кто и что посылает, в каком формате и когда. Я сам вполне успешно по этой спецификации писал реализацию и клиента и сервера на низком уровне с нуля без всяких дополнительных библиотек, оберток и прочего практически на голом системном API.
Смотрите раздел 4 - установление соединения.
стался вопрос с реализацией объекта socket
Какого объекта? В спецификации нет таких объектов.
как его воспроизвести на Node JS, как в этом примере, где мы его получаем в аргументах
Что это за пример и откуда вы его взяли? В node.js у сокета нет такого события, как upgrade: https://nodejs.org/api/net.html
В рамках HTTP, upgrade - это переход соединения от протокола HTTP на другой: https://developer.mozilla.org/en-US/docs/Web/HTTP/...
Т.е., вам на сервер приходит HTTP запрос с заголовком upgrade, далее вы подготавливаете клиенту ответ и отправляете его. Далее клиент и сервер начинают работать уже по протоколу WS. Все очень детально и по шагам расписано в стандарте.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации события upgrade в методе net.createServer в Node.js, необходимо использовать метод on() для объекта сервера, который будет слушать событие 'upgrade'.
Пример реализации:
const net = require('net'); const server = net.createServer(); server.on('upgrade', (req, socket) => { // Ваш код обработки события upgrade здесь }); server.listen(3000, () => { console.log('Сервер запущен на порте 3000'); });
В данном примере, когда сервер создается с помощью метода net.createServer(), мы добавляем обработчик события 'upgrade' с помощью метода on(). При возникновении события 'upgrade', будет вызвана функция, которая принимает в качестве параметров объект запроса (req) и сокет (socket).
Вы можете использовать этот обработчик события для обработки апгрейда соединения, например, для переключения на протокол WebSocket.
Не забудьте добавить обработку ошибок и другие необходимые проверки в вашем коде для обеспечения безопасности и стабильности работы сервера.