Real Time Multiplayer in HTML5: only single-computer

I am having difficulty getting multiplayer games to be multi-computer, not just multi-browser tabs. I went through the Real Time Multiplayer in HTML5 tutorial (Build New Games, click here). It listens on port 4004, but I can't connect from my LAN's other computer by visiting 192.168.1.4:4004, even though I can connect with my Apache web server on port 80 by visiting 192.168.1.4 (I've since disabled Apache and forwarding port 80 on my router, instead I forward port 4004). I used to connect to Apache from the outside world by visiting my-domain.com (its DNS is hosted by my ISP). Now I can't connect from outside my LAN to my tutorial by visiting my-domain.com or my-domain.com:4004. The tutorial uses node.js, socket.io, and express. You start it by entering node app.js in a terminal. You add a new player by visiting 127.0.0.1:4004 or 192.168.1.4:4004. Here is the contents of app.js:

var
    gameport        = process.env.PORT || 4004,
    express         = require('express'),
    UUID            = require('node-uuid'),
    verbose         = false,
    app             = express()
  , http = require('http')
  , server = http.createServer(app)
  , io = require('socket.io').listen(server);

/* Express server set up. */

//The express server handles passing our content to the browser,
//As well as routing users where they need to go. This example is bare bones
//and will serve any file the user requests from the root of your web server (where you launch the script from)
//so keep this in mind - this is not a production script but a development teaching tool.

    //Tell the server to listen for incoming connections
server.listen( gameport );

    //Log something so we know that it succeeded.
console.log('\t :: Express :: Listening on port ' + gameport );

    //By default, we forward the / path to index.html automatically.
app.get( '/', function( req, res ){
    res.sendfile( __dirname + '/index.html' );
});
    //This handler will listen for requests on /*, any file from the root of our server.
    //See expressjs documentation for more info on routing.

app.get( '/*' , function( req, res, next ) {

        //This is the current file they have requested
    var file = req.params[0];

        //For debugging, we can track what files are requested.
    if(verbose) console.log('\t :: Express :: file requested : ' + file);

        //Send the requesting client the file.
    res.sendfile( __dirname + '/' + file );

});
/* Socket.IO server set up. */

//Express and socket.io can work together to serve the socket.io client files for you.
//This way, when the client requests '/socket.io/' files, socket.io determines what the client needs.

    //Create a socket.io instance using our express server
var sio = io;

    //Configure the socket.io connection settings.
    //See http://socket.io/
sio.configure(function (){

    sio.set('log level', 0);

    sio.set('authorization', function (handshakeData, callback) {
      callback(null, true); // error first callback style
    });

});
    //Enter the game server code. The game server handles
    //client connections looking for a game, creating games,
    //leaving games, joining games and ending games when they leave.
game_server = require('./game.server.js');

    //Socket.io will call this function when a client connects,
    //So we can send that client looking for a game to play,
    //as well as give that client a unique ID to use so we can
    //maintain the list if players.
sio.sockets.on('connection', function (client) {

        //Generate a new UUID, looks something like
        //5b2ca132-64bd-4513-99da-90e838ca47d1
        //and store this on their socket/connection
    client.userid = UUID();

        //tell the player they connected, giving them their id
    client.emit('onconnected', { id: client.userid } );

        //now we can find them a game to play with someone.
        //if no game exists with someone waiting, they create one and wait.
    game_server.findGame(client);

        //Useful to know when someone connects
    console.log('\t socket.io:: player ' + client.userid + ' connected');

        //Now we want to handle some of the messages that clients will send.
        //They send messages here, and we send them to the game_server to handle.
    client.on('message', function(m) {
        game_server.onMessage(client, m);
    }); //client.on message

        //When this client disconnects, we want to tell the game server
        //about that as well, so it can remove them from the game they are
        //in, and make sure the other player knows that they left and so on.
    client.on('disconnect', function () {

            //Useful to know when soomeone disconnects
        console.log('\t socket.io:: client disconnected ' + client.userid + ' ' + client.game_id);

            //If the client was in a game, set by game_server.findGame,
            //we can tell the game server to update that game state.
        if(client.game && client.game.id) {

            //player leaving a game should destroy that game
            game_server.endGame(client.game.id, client.userid);

        } //client.game_id

    }); //client.on disconnect

}); //sio.sockets.on connection

I realize that port forwarding and router issues may be outside the scope of most multiplayer game tutorials. Nevertheless, I hope someone can help me out here. Thanks.

According to the comments, the issue was firewall related. Each OS nowadays has somewhat restrictive firewall settings by default, so it is always important to check these settings, specially if the affected service works from localhost but cannot be accessed from other devices.