Socket.io не работает с внешним доступом без экспресса - PullRequest
0 голосов
/ 14 мая 2018

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

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

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

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

io.on("connection", function (socket) {
 console.log('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.log("tweet from", tweet.username);
console.log("contents:", tweet.text);
});

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

1 Ответ

0 голосов
/ 15 мая 2018

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

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.log("Server listening at port %d", port);
});

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

  socket.on("hello", function(data) {
    console.log(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, если вам было интересно.

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