Нужно ли подключать сервер socket.io к http-серверу? - PullRequest
0 голосов
/ 27 сентября 2019

Я учусь в первый раз socket.io.Я хотел бы запустить простой сервер сокетов.Я вижу каждый пример, который я нашел в интернете, сделанный так:

var http = require('http');
var fs = require('fs');

// Loading the index file . html displayed to the client
var server = http.createServer(function(req, res) {
    fs.readFile('./index.html', 'utf-8', function(error, content) {
        res.writeHead(200, {"Content-Type": "text/html"});
        res.end(content);
    });
});

// Loading socket.io
var io = require('socket.io').listen(server);

// When a client connects, we note it in the console
io.sockets.on('connection', function (socket) {
    console.log('A client is connected!');
});


server.listen(8080);

Вопрос

Суть моего вопроса проста: во всех подобных примерах я вижу, что я слушаю, прикрепленный ксуществующий http-сервер.

Это требование?Если да, то почему?Протокол веб-сокета передается через http?

Вариант использования

Вероятно, мой сценарий использования немного странный: у меня есть сервер Vue Dev, который должен работать, потому что он предлагает перезагрузку в реальном времени и т. Д.Он прослушивает порт 8080 и предлагается vue-cli-service, поэтому я не могу изменить его, чтобы прикрепить что-либо.

Кроме того, у меня есть «ручной» и экспериментальный сервер smtp, созданный в node.js и работающий на порту 25

Я хочу использовать websocket, чтобы разрешить моему серверу smtp 'сообщение "и мое веб-приложение Vue.js" слушать ".

Конечная цель: создание автономной системы smtp-catch-all с простым веб-интерфейсом, поэтому каждое письмо, отправленное через мой smtp, «помещается» в мое веб-приложение и никогда не сохраняется (и никогда не отправляется!)

Учитывая это, я хотел бы создать «автономный» сервер socket.io.Если ему просто нужен http-сервер, я создаю второй на конкретном порту, чтобы разрешить обновление http-> websocket;тогда мое веб-приложение просто подключится к серверу сокетов на этом вторичном сервере.

Я предпочитаю таким образом, потому что, используя pm2, я могу запускать каждую службу, не касаясь другой

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Протокол WebSocket - это отдельный протокол, он не построен поверх HTTP.Однако в самом протоколе HTTP есть механизм обновления (т.е. рукопожатие WebSocket), который превращает простое соединение HTTP в соединение WebSocket.А поскольку браузеры используют это, невозможно установить соединение WebSocket из браузера без HTTP.

Примечание: socket.io также использует другие протоколы.Они возвращаются к ним, если протокол WebSocket недоступен.

Теперь следующее (очевидно) мнение: нет необходимости подключать один сервер к другому.На самом деле это анти паттерн.Обычно вы хотите, чтобы компоненты были как можно более независимыми, чтобы изменения одного не влияли на другой.Более того: даже если бы оба работали по HTTP, все равно нет причин делать это.Я нахожу эти уроки по крайней мере вводящими в заблуждение.

0 голосов
/ 27 сентября 2019

Я добавляю проверку концепции сервера smtp, который просто перехватывает всю полученную почту, но не отправляет ее на реальную цель.

Кроме того, он генерирует события при соединении с socket.io.

Все без использования http-сервера.

SMTP + сервер socket.js

const SMTPServer = require("smtp-server").SMTPServer;

const io = require('socket.io')(2626);

const server = new SMTPServer({
  logger: true,
  debug: true,
  allowInsecureAuth: true,
  onAuth(auth, session, callback) {
    console.log("onAuth, user", auth.username, "password", auth.password);
    if (auth.username !== "abc" || auth.password !== "def") {
      return callback(new Error("Invalid username or password"));
    }
    io.emit("smtpAuth", auth);
    callback(null, { user: 123 }); // where 123 is the user id or similar property
  },

  onConnect(session, callback) {
    console.log("onConnect, from ip ", session.remoteAddress);
    io.emit("smtpConnect", session);
    return callback(); // Accept the connection
  },

  onMailFrom(address, session, callback) {
    console.log("onMailFrom", address.address);
    io.emit("smtpMailFrom", address);
    return callback(); // Accept the address
  },

  onRcptTo(address, session, callback) {
    console.log("onRcptTo", address.address);
    io.emit("smtpRcptTo", address);
    return callback(); // Accept the address
  },

  onData(stream, session, callback) {
    var email_content = "";
    // stream.pipe(email_content); // print message to console
    stream.on('data', (chunk) => { email_content += chunk });
    stream.on("end", function() {
      // Stream ended
      console.log (email_content);
      io.emit("smtpData", email_content);
      callback();
    });
  }
});

server.on("error", err => {
  console.log("Error %s", err.message);
});

server.listen(25);

Пример кода VUE.JS

Этот компонент автоматически уведомляетсясервером socket.io, если что-то новое происходит.В этом случае он может регистрировать все события, а также сохранять все данные электронной почты (необработанные).

<code><template>
  <div class="hello">
    <h1>Le email che abbiamo ricevuto per te</h1>
    <pre 
      v-for="(message, index) in messages" 
      :key="index"
    >{{ 
      message
    }}
экспорт по умолчанию {name: "App", data () {return {messages: [],}}, сокеты: {connect () {console.log ('сокет подключен')}, smtpAuth (val) {console.log ('SMTP AUTH', val);}, smtpConnect (val) {console.log ('SMTP CONNECT', val);}, smtpMailFrom (val) {console.log ('SMTP MAIL FROM', val);}, smtpRcptTo (val) {console.log ('SMTP RCPT TO', val);}, smtpData (val) {console.log ('SMYP DATA', val);this.messages.push (вал);}},};

Пример того, как продолжать работу сервера smtp / socket и приложения сервера vue-cli dev с использованием pm2

Вызовите это ecosystem.config.js

module.exports = {
  apps: [
    {
      name: "WEB",
      script: "./node_modules/@vue/cli-service/bin/vue-cli-service.js",
      args: "serve"
    },
    {
      watch: true,
      name: "SMTP",
      script: "./server/index.js"
    }
  ]
};

Запустите его как pm2 run ecosystem.config.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...