Как в net.createServer реализовать событие upgrade?

Ссылка скопирована
26 апреля 2026 1 ответ

Как я понял, 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-запроса, что не очень тривиально и непонятно зачем это нужно если он уже реализован…

  • https://github.com/nodejs/node/blob/main/lib/_http...
  • Lynn «Кофеман», чтобы понять реализацию события upgrade, как именно он получает и преобразует данные клиента в объект socket через который после можно отправлять данные
  • MishaXXL, что бы зачем?
  • Lynn «Кофеман», ну, интересно, как оно там
  • MishaXXL, ну вон по ссылке выше написано как оно там на 1000+ строчек…
  • Собственно, ответ я вам уже давал в предыдущем вашем вопросе и он все тот же: согласно спецификациям протокола - там все очень детально расписано, что посылает клиент, что и когда отвечает сервер. Вы соответствующий раздел прочитали? Какая именно у вас с ним сложность?

    • Я читал, но там все на словах и остался вопрос с реализацией объекта 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. Все очень детально и по шагам расписано в стандарте.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Павел Админов Ответ

    Для реализации события 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');
    });

    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.

    Не забудьте добавить обработку ошибок и другие необходимые проверки в вашем коде для обеспечения безопасности и стабильности работы сервера.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно