Задать вопрос
@MishaXXL

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

Как я понял, http.createServer это некая надстройка над net.createServer в котором реализован дополнительный функционал из события net.createServer().on('data')

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

Откуда брать данные для 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('\r\n').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}`,
        '\r\n',
      ]
      
      socket.write(responseHeaders.join('\r\n'))

      // 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
        })
    })
})
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Средний 6 комментариев
Решения вопроса 1
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Собственно, ответ я вам уже давал в предыдущем вашем вопросе и он все тот же: согласно спецификациям протокола - там все очень детально расписано, что посылает клиент, что и когда отвечает сервер. Вы соответствующий раздел прочитали? Какая именно у вас с ним сложность?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы