Заставить xampp и node(socket.io) работать вместе

У меня есть небольшое веб-приложение, которое применяет некоторые AngularJS и php для некоторых функций и некоторых запросов из базы данных (Apache xampp и mySQL). Теперь я хочу обратиться в простой чат в веб-приложении и я не знаю, как настроить ни какие порты и т.д.

После чего-то похожего на http://socket.io/get-started/chat/

У меня есть index.js как таковой

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
   res.sendFile(__dirname + '/index.html');

});

io.on('connection', function(socket){
   console.log('a user connected');
   socket.on('disconnect', function(){
   console.log('user disconnected');
   });
});


http.listen(443, function(){
  console.log('listening on *:443');
});

Я пробую порты 443 и 80, но они не работают (xampp показывает 80 и 443, понятия не имею, как работают порты)

мой файл JS имеет var socket = io();

В консоли моего браузера я получаю что-то вроде

socket.io-1.2.0.js:2 GET http://localhost/socket.io/?IO=3&transport=polling&t=1465649664392-0 404 (Not Found)

Как решить эту проблему? Я ожидаю вывода, такого как a user connected в cmd после запуска node index.js, но я этого не делаю.

Я последовал примеру для чата, и он отлично работает без xampp.


person Lester    schedule 11.06.2016    source источник


Ответы (3)


Ваша проблема в том, что для работы socket.io необходимо иметь возможность взаимодействовать с серверной частью через http (например, для переключения протокола). Но если xampp использует порт, это не сработает. Возможно, вы могли бы попробовать что-то, где ваш xampp перенаправляет запросы на http://localhost/socket.io/* на сервер node.js.

Вы можете использовать директиву https://stackoverflow.com/a/18604082/6430127 и сделать что-то вроде

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:8000/$1 [P,L]

ProxyPass        /socket.io http://localhost:8000/socket.io
ProxyPassReverse /socket.io http://localhost:8000/socket.io

Также убедитесь, что необходимые модули включены

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

Затем вам нужно будет запустить сервер node.js на порту 8000.

http.listen(8000, function(){
  console.log('listening on *:8000');
}); 
person Till Arnold    schedule 11.06.2016
comment
Мне просто поместить директиву в любом месте файла конфигурации? и могу ли я нормально обращаться к xampp, например localhost/foldername? - person Lester; 11.06.2016
comment
Вы делаете все нормально. Вы добавляете директиву в любом месте файла httpd.conf. Я добавил его в конец файла. - person Till Arnold; 11.06.2016
comment
Можно ваш пример? Я сделал все, что вы сказали, и ничего не изменилось (вероятно, мне не хватает знаний об этих вещах) - person Lester; 12.06.2016
comment
Мой apache/conf/httpd.conf — это pastebin.com/ruihe9GR. Вероятно, вы не сможете скопировать весь файл из-за абсолютных путей. Мой main.js файл — это pastebin.com/CTfgNJmS. Я запускаю его с node main.js. Мой файл index.php называется pastebin.com/YWh7haPF. У меня есть этот файл в htdocs/php-test/index.php. Я получаю доступ к примеру в своем браузере под http://localhost/php-test/. Я использую версию xampp для Windows под Windows 10. О, и вам нужно перезапустить apache после изменения httpd.conf - person Till Arnold; 12.06.2016

Вы можете просто сделать это, и нет необходимости в каких-либо http-перенаправлениях, открывающих js на стороне клиента.

var configUrl = 'http://localhost:3000';// currently my node js using this port
var socket = io(configUrl); 

а остальные вещи работают гладко на вашей стороне клиента

socket.emit('chatMessage', ...
socket.on('chatMessage', ..
person Ishak Ali    schedule 07.12.2016

Мы можем использовать клиентскую библиотеку scoket.io, поэтому мы можем использовать JavaScript в качестве клиента и node.js в качестве сервера.

Пожалуйста, ознакомьтесь с приведенным ниже примером:

index.html(клиент)

<!DOCTYPE html>
<html>
<head>
  <title>Hello world</title>
  <script src="https://cdn.socket.io/4.0.1/socket.io.js"></script>
</head>
<body>
  <script>
    var socket = io('http://localhost:5000');
  </script>
</body>
</html>

app.js (сервер Node.js)

var io=require('socket.io')(5000,{
  cors:{
    origin: "http://localhost",
  },
});


//Whenever someone connects this gets executed
io.on('connection',socket => {
 console.log('A user connected');
});
person Parag Jain    schedule 13.07.2021