Socket.io не работает с внешним доступом без экспресс

У меня вопрос: можно ли запустить socket.io lib без использования экспресс? Дело в том, что я хочу сделать node в качестве внешнего сервера веб-сокетов, который просто получает соединение с сокетами и обратные вызовы и просто отвечает на них, а не для создания собственных маршрутов или отправки просмотра страницы (я использую codeigniter для этой работы).

Мое текущее тестовое приложение на сервере выглядит так:

var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 4000;

server.listen(port, function() {
  console.info('Server listening at port %d', port);
});

io.on("connection", function (socket) {
 console.info('A new socket has joined: ' + socket.id);
 var tweet = {user: "nodesource", text: "Hello, world!"};

// to make things interesting, have it send every second
var interval = setInterval(function () {
  socket.emit("tweet", tweet);
}, 1000);

 socket.on("disconnect", function () {
  clearInterval(interval);
 });
});

На клиенте:

<script>
const socket = io('http://localhost:4000/node_server');


socket.on('disconnect',function(){
    alert('Im not connected, server is down');
});

socket.on("tweet", function(tweet) {
// todo: add the tweet as a DOM node
console.info("tweet from", tweet.username);
console.info("contents:", tweet.text);
});

Моя проблема в том, что я протестировал с выражением примера чата socket.io, и он работает, но они используют маршрут и отправляют страницу, и в моем случае я просто хочу, чтобы моя другая внешняя страница общалась с узлом, а не узел отправлял мне страницу . В основном, когда я запускаю какой-либо излучатель или функцию на сервере или клиенте, он не срабатывает только на сервере, соединение, но ничего больше (p.s: также использовал io.sockets.on и тоже не работает) Если кто-то прошел это и знает, в чем может быть моя проблема, я буду рад.

Если вы настраиваете это приложение как отдельное приложение, действительно ли имеет значение, какое серверное программное обеспечение вы используете? И почему вы слушаете http://localhost:4000/node_server вместо http://localhost:4000? Простой http-сервер был бы болью imo.

Michael Sorensen 14.05.2018 19:23

Поскольку фактический клиент - это index.html, расположенный в другой папке, а node_server - это то место, где модули index.js и node должны иметь возможность запускать сервер. Дело не в этом, дело в том, что сокеты подключаются, и вы видите событие, запущенное на консоли узла, что означает, что сокет подключен на стороне сервера, но он не запускает функцию подключения клиента или обратные вызовы, которые я помещаю туда, и я уже протестировал несколько

Enigma 14.05.2018 19:27

Папка / файл клиента находится на том же хосте, но скоро это будут разные хосты, но дело не в пути, на самом деле триггеры не работают, когда у меня стабильное соединение

Enigma 14.05.2018 19:31

Другое дело, клиент socket.connected возвращает false, что означает, что сокет не подключен, но на сервере он регистрируется и запускается при подключении, поэтому я не могу понять, что происходит

Enigma 14.05.2018 19:59

Я думаю, здесь может быть некоторая путаница, но из того, что я могу понять, похоже, что вы просто хотите отделить клиента от сервера, потому что они размещены на двух разных машинах. Так ли это? Если да, я могу написать вам быстрый пример.

Michael Sorensen 14.05.2018 23:31

Да, в основном дело в том, что я использую платформу MVC (php), которая будет возвращать представление, и я не хочу выражать эту грязную работу за меня, поэтому, на мой взгляд, я хочу добавить скрипт, который подключается к внешнему сервер, который просто получает и отправляет данные через сокеты (как сервер с узлом)

Enigma 14.05.2018 23:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
934
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, давайте начнем с чего-то действительно простого, вот наш экспресс-сервер, на котором размещается только наше приложение для сокетов:

var app = require("express")();
var server = require("http").createServer(app);
var io = require("socket.io")(server);
var port = process.env.PORT || 4000;

server.listen(port, function() {
  console.info("Server listening at port %d", port);
});

io.on("connection", function(socket) {
  console.info("A new socket has joined: " + socket.id);

  socket.on("hello", function(data) {
    console.info(data);
  });
});

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

Теперь посмотрим на клиентский html файл.

<html>

<body>
    <button id = "hiBtn">Say Hi to your server</button>
    <!-- You only need to include the client file here -->
    <script src = "https://rawgit.com/socketio/socket.io-client/master/dist/socket.io.js" </script>
    </script>
    <script>
        const serverLocation = "localhost:4000" // or whatever your server location is
        const socket = io(serverLocation);

        window.onload = function () {
            document.getElementById("hiBtn").addEventListener("click", function () {
                socket.emit("hello", "Hi there, this is the client speaking");
            })
        }
    </script>
</body>

</html>

Обратите внимание, что у меня нет <script src = "/socket/socket.io">, это потому, что этот html-файл размещается на совершенно отдельном клиенте. Вам нужно просто включить сюда клиентский файл socket.io, который обычно находится в node_modules\socket.io-client\dist\socket.io.js, если вы установили его через NPM. Или вы можете использовать URL-адрес, который я предоставил в моем примере. Просто убедитесь, что serverLocation указывает на ваш экспресс-сервер, и все готово.

P.S. в этом примере я протестировал его, разместив html-файл на порту: 5000 и экспресс-сервер на порту: 4000, если вам было интересно.

Это не то, что я ищу, это то, что показывает каждый пример документа о том, что клиент и сервер находятся в папке diff или что-то еще. Я не хочу использовать экспресс, потому что у меня есть мой php, на котором размещены представления, и у этих представлений есть скрипт для подключения к вводу-выводу. например, мое представление php находится в локальный / платформа / index.html, а мой узел находится в localhost / node_server, и поэтому я пытался подключиться к порту: 4000 специально для этой папки

Enigma 15.05.2018 10:13

Это было упоминание папки в URL-адресе подключения.

Enigma 15.05.2018 10:20

Другие вопросы по теме