Node.js + Socket.io + Apache

javascript, node.js, socket.io, websocket

Solution

Serve your static content from Apache port 80 and serve your dynamic/data content over a Socket.IO server on port 8080. You don't need the `app = require('http').createServer(handler)` in your Socket.IO app

Apache port 80 |-------------| clients |------------| Socket.IO port 8080

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function (socket) {
  io.sockets.emit('this', { will: 'be received by everyone'});

  socket.on('clientMSG', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    sockets.emit('user disconnected');
  });
});

Problem

I'm looking for a way to integrate Node.js + Socket.io + Apache in the following way: I want apache to continue serving HTML / JS files. I want node.js to listen for connection on port 8080. Something like this: ``` var util = require("util"), app = require('http').createServer(handler), io = require('/socket.io').listen(app), fs = require('fs'), os = require('os'), url = require('url'); app.listen(8080); function handler (req, res) { fs.readFile(__dirname + '/index.html', function (err, data) { if (err) { res.writeHead(500); return res.end('Error loading index.html'); } res.writeHead(200); res.end(data); }); } io.sockets.on('connection', function (socket) { socket.emit('news', { hello: 'world' }); socket.on('my other event', function (data) { socket.emit('ok 1', { hello: 'world' }); }); socket.on('clientMSG', function (data) { socket.emit('ok 2', { hello: 'world' }); }); }); ``` if I access a HTML that connect to this server, it works, but I need to go to mydomian.com:8080/index.html. What I want is to be able to go to mydomian.com/index.html. and be able to open a socket connection: ``` <script> var socket = io.connect('http://mydomain.com', {port: 8080}); socket.on('news', function (data) { console.log(data); socket.emit('my other event', { my: 'data from the client' }); }); socket.on('connect', function (data) { console.log("connect"); }); socket.on('disconnect', function (data) { console.log("disconnect"); }); //call this function when a button is clicked function sendMSG() { console.log("sendMSG"); socket.emit('clientMSG', { msg: 'non-scheduled message from client' }); } </script> ``` In this example I had to use fs.readFile of wont work when I go to the port 8080 in the URL. Any suggestions? Tks.

Original source

Related problems