Websocket на ("сообщение") не работает - PullRequest
0 голосов
/ 02 июня 2018

Я создаю приложение node.js и запускаю WebSocket, используя как файл server.js, так и файл rout.js.Я пытаюсь использовать файл rout.js для отправки сообщения на определенной странице и в конечном итоге собираюсь направить сокет-сообщение определенным клиентам websocket.В настоящее время у меня возникают проблемы при работе функции on ("message").

Из файла server.js:

require('./app/routes.js')(app, passport, wss); // load our routes and pass in our app and fully configured passport

wss.on('connection', function connection(ws, req) {
            console.log('Client connected');
            ws.on('message', function incoming(message){
                console.log("Incoming message: %s", message);
            })
            ws.on('close', () => console.log('Client disconnected'));
})
        ;

Из файла rout.js:

app.post('/allbooks', function(

req,res)
{
    wss.clients.forEach((client) => {
    var arrayToSend = JSON.stringify([req.body.bookid, [], req.body.userSays]);
        console.log("Printing within routes.js");
        console.log(arrayToSend);
        client.send(arrayToSend);
    });
    res.redirect('/allbooks');    
});

Когда я отправляю сообщение, я вижу в журнале «Печать в маршрутах.js», но не вижу части «Входящее сообщение» из части server.js.Почему бы и нет?

PS Вот файл scripts.js со страницы, на которой я работаю:

var HOST = location.origin.replace(/^http/, 'ws')
  var ws = new WebSocket(HOST);
  ws.onmessage = function (event) {
    eventJSON = JSON.parse(event.data);
      if ($("#"+eventJSON[0]+"-request").length > 0){
        $("#"+eventJSON[0]+"-request").html("Message sent");
      }
    } 

1 Ответ

0 голосов
/ 02 июня 2018

Я не знаю, является ли этот пакетом, который вы используете, но какой бы вы ни использовали, он будет похожим.В файле readme рассматриваются два примера:

Пример сервера

В примере сервера они создают сервер веб-сокетов:

const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

  ws.send('hello from the server!');
});

Это создает прослушиваниесервер сокетов.Он добавляет прослушиватель событий для message, поэтому, когда клиент подключается к серверу, клиент может отправлять сообщения, и этот обработчик событий запускается.

После этого прослушивателя событий он отправляет строку 'hello from the server!'.Этот вызов отправки НЕ будет запускать вышеупомянутый обработчик событий, потому что этот вызов отправки происходит на стороне сервера сокета.Он отправляет сообщение для получения на стороне клиента этого сокета.

Пример клиента (обычно в браузере)

const WebSocket = require('ws'); // omit this line if including ws via <script> tag

const ws = new WebSocket('ws://www.host.com/path');

ws.on('open', function open() {
  ws.send('hello from the client!');
});

ws.on('message', function incoming(data) {
  console.log(data);
});

Это клиентский сценарий, который подключается к серверу сокетов впервый пример.Он подключается, и событие 'connection' будет вызвано на сервере сокетов выше.Затем сервер сокетов вызывает ws.send('hello from the server!');, и наш клиентский сценарий устанавливает прослушиватель для 'message', поэтому он запускает и выводит 'hello from the server!' на консоль браузера.

Этот клиентский сценарий также устанавливает 'open' обработчик событий, который срабатывает после успешного подключения к серверу сокетов.Таким образом, он будет запускать и отправлять 'hello from the client!' на сервер.Обработчик сервера для 'message' сработает, и в терминале сервера вы увидите 'hello from the client!' printout.


В вашем примере вы делаете это с сервера (ваш сервер routs.js на стороне сервера).file)

wss.clients.forEach(function each(client) {
  if (client.readyState === WebSocket.OPEN) {
    client.send(data);
  }
});

То, что вы делаете, - это перебор всех подключенных клиентов, которые успешно подключились к серверу сокетов, и вы отправляете сообщение каждому из них в отдельности.Это все равно будет , а не запускать обработчик событий on на стороне сервера для 'message', который вы установили на каждом сокете при каждом первом подключении.Он будет запускать обработчик на стороне клиента в браузере.


Редактировать на основе вашего последнего комментария выше:

Чтобы делать то, что вы хотите, вы хотите, чтобы что-то подобное было наклиент:

myButton.onClick = function (e) {
  ws.send("Hey everyone! I'm Chev!");
};

Затем на сервере в обработчике соединений вы захотите настроить обработчик сообщений следующим образом:

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    wss.clients.forEach(function each(client) {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });
});

Вы можете сделать message бытьобъект вместо строки, чтобы вы могли выполнять различные действия в зависимости от свойств этого объекта, но для простоты я просто заставил сервер транслировать любое полученное сообщение остальному серверу.

Обратите внимание на оператор ifпроверка того, что мы не передадим сообщение обратно тому же клиенту, который его отправил.

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