Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Listen on specific url instead of port

I am entirely new to Nodejs and trying to get familiar with it. Well, currently, I am trying to push notifications on the web browser if any change happens in the database. I have piece of code which i have been using for testing purpose first. Following code works fine to send updates to browser when database table contents change:

Server.js

var app = require('http').createServer(handler).listen(8000),
  io = require('socket.io').listen(app),
  fs = require('fs'),
  mysql = require('mysql'),
  connectionsArray = [],
  connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs',
    port: 3306
  }),
  POLLING_INTERVAL = 3000,
  pollingTimer,
  pollingTimer_2;


// If there is an error connecting to the database
connection.connect(function(err) {
  // connected! (unless `err` is set)
  console.log(err);
});


// on server started we can load our client.html page
function handler(req, res) {
  fs.readFile(__dirname + '/client.html', function(err, data) {
    if (err) {
      console.log(err);
      res.writeHead(500);
      return res.end('Error loading client.html');
    }
    res.writeHead(200);
    res.end(data);
  });
}




/*
 * This function loops on itself since there are sockets connected to the page
 * sending the result of the database query after a constant interval
 *
 */

var pollingLoop = function() {

  // Doing the database query
  var query = connection.query('SELECT * FROM users'),
    users = []; // this array will contain the result of our db query

  // setting the query listeners
  query
    .on('error', function(err) {
      // Handle error, and 'end' event will be emitted after this as well
      console.log(err);
      updateSockets(err);
    })
    .on('result', function(user) {
      // it fills our array looping on each user row inside the db
      users.push(user);
    })
    .on('end', function() {
      // loop on itself only if there are sockets still connected
      if (connectionsArray.length) {
        pollingTimer = setTimeout(pollingLoop, POLLING_INTERVAL);

        updateSockets({
          users: users
        });
      }
    });

};


// creating a new websocket to keep the content updated without any AJAX request
io.sockets.on('connection', function(socket) {

  console.log('Number of connections:' + connectionsArray.length);
  // starting the loop only if at least there is one user connected
  if (!connectionsArray.length) {
    pollingLoop();

  }

  socket.on('disconnect', function() {
    var socketIndex = connectionsArray.indexOf(socket);
    console.log('socket = ' + socketIndex + ' disconnected');
    if (socketIndex >= 0) {
      connectionsArray.splice(socketIndex, 1);
    }
  });

  console.log('A new socket is connected!');
  connectionsArray.push(socket);

});

var updateSockets = function(data) {
  // adding the time of the last update
  data.time = new Date();
  // sending new data to all the sockets connected
  connectionsArray.forEach(function(tmpSocket) {
    tmpSocket.volatile.emit('notification', data);
  });
};

Client.html

<html>
    <head>

        <title>Push notification server streaming on a MySQL db</title>
        <style>
            dd,dt {
                float:left;
                margin:0;
                padding:5px;
                clear:both;
                display:block;
                width:100%;

            }
            dt {
                background:#ddd;
            }
            time {
                color:gray;
            }
        </style>
    </head>
    <body>
        <time></time>
        <div id="container">Loading ...</div>
    <script src="socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script>

        // create a new websocket
        var socket = io.connect('http://localhost:8000');
        // on message received we print all the data inside the #container div
        socket.on('notification', function (data) {
        var usersList = "<dl>";
        $.each(data.users,function(index,user){
            usersList += "<dt>" + user.user_name + "</dt>\n" +
                         "<dd>" + user.user_desc + "\n" +
                            "<figure> <img class='img-polaroid' width='50px' src='" + user.user_img + "' /></figure>"
                         "</dd>";
        });
        usersList += "</dl>";
        $('#container').html(usersList);

        $('time').html('Last Update:' + data.time);
      });
    </script>
    </body>
</html>

Now, as you can see that currently server is listening at the port 8000. I am just wondering that how can i change it to listen to an specific url ? Because if i am going to implement on the server project then I am not going to using the url to listen on ports ? Rather i want to use it as plain Url as I can smoothly send notification to if any user is connected to specific url?

Any help?

like image 764
Princess Avatar asked Oct 23 '14 00:10

Princess


Video Answer


1 Answers

If you want your node server to respond to the URL http://www.example.com/updates, then you make your server listen on port 80 (the default port if no port is listed and the protocol is "http"). And, then you make your server respond to the "/updates" route.

Servers listen on a specific port at a specific IP address. They don't listen to a path or URL. The browser uses DNS to get an IP address for the host in the URL. If there's a port number in the URL, it uses that port. If not, it uses the default port for the specific protocol. It then makes a TCP connection to that IP address on that port. Then, if the protocol is http, it sends a request on that connection and includes the path.

So, the server receives the incoming connection and then as part of the HTTP protocol, it receives the verb (GET, POST, DELETE, etc...) and the path which it is then the servers job to decide what to do based on the incoming command/path.

like image 83
jfriend00 Avatar answered Sep 28 '22 17:09

jfriend00