2014-10-23 18 views
5

Jestem całkowicie nowy dla Nodejs i próbuję go poznać. Cóż, obecnie próbuję przekazywać powiadomienia w przeglądarce internetowej, jeśli nastąpi jakakolwiek zmiana w bazie danych. Mam fragment kodu, którego używałem do testowania jako pierwszy. Poniższy kod działa poprawnie wysłać aktualizacji do przeglądarki, gdy zawartość tabeli bazy danych zmiany:Posłuchaj konkretnego adresu URL zamiast portu

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> 

Teraz, jak widać, aktualnie serwer nasłuchuje na port 8000. Zastanawiam się tylko, jak mogę to zmienić, aby słuchać konkretnego adresu URL? Bo jeśli zamierzam implementować projekt serwera, to nie zamierzam używać adresu URL do odsłuchiwania portów? Raczej chcę użyć go jako zwykłego adresu URL, ponieważ mogę płynnie wysyłać powiadomienia, jeśli dowolny użytkownik jest podłączony do określonego adresu URL?

Każda pomoc?

+2

Severs nie nasłuchuje na adresach URL. Słuchają na danym porcie dla danego adresu IP. Nie możesz tego zmienić. Jeśli masz na myśli, że nie chcesz podawać numeru portu w adresie URL, serwer powinien nasłuchiwać na porcie 80 (domyślny port http). Połączenie nie jest nawiązywane z adresem URL. Jest on wprowadzany do danego portu na danym serwerze, a następnie ścieżka adresu URL jest przekazywana jako dane po połączeniu. – jfriend00

+0

Nie rozumiem, w jaki sposób będę się wtedy stosować do powiadomień push dotyczących konkretnego adresu URL? powiedzmy, że mam następujący link, w którym użytkownik loguje się "http: // www.example.com/updates". Jak mogę teraz przesłać aktualizacje tego linku, jeśli w bazie danych wystąpią jakieś zmiany? przy obecnym scenariuszu będzie to tak: 'http: //www.example.com: 8000/updates'. – Princess

+0

Uczyniasz swojego serwera nasłuchem na porcie 80 i sprawiasz, że serwer twojego serwera odpowiada na ścieżkę '/ updates'. W ten sposób łączysz się z 'http: // www.example.com/updates'. Jeśli w adresie URL nie ma numeru portu, a protokół to 'http', to port domyślnie przyjmuje port 80. – jfriend00

Odpowiedz

4

Jeśli chcesz, aby serwer węzła odpowiadał na adres URL http://www.example.com/updates, ustaw serwer na nasłuchiwanie na porcie 80 (domyślny port, jeśli nie ma portu, a protokół to "http"). A następnie zmusić serwer do odpowiedzi na trasę "/updates".

Serwery nasłuchują na określonym porcie pod określonym adresem IP. Nie słuchają ścieżki ani adresu URL. Przeglądarka używa DNS, aby uzyskać adres IP hosta w adresie URL. Jeśli w adresie URL znajduje się numer portu, używa tego portu. Jeśli nie, używa domyślnego portu dla określonego protokołu. Następnie tworzy połączenie TCP z tym adresem IP na tym porcie. Następnie, jeśli protokół jest http, wysyła żądanie do tego połączenia i zawiera ścieżkę.

Tak więc, serwer odbiera połączenie przychodzące, a następnie jako część protokołu HTTP otrzymuje czasownik (GET, POST, DELETE, itp.) I ścieżkę, która następnie jest zadaniem serwera, aby zdecydować, co do zrobienia w oparciu o przychodzące polecenie/ścieżkę.

+0

Cóż, próbowałem twojej drogi, ale wyskakuje 'EADDRINUSE'. To dlatego, że mój apachi działa również na tym samym porcie. Dlatego zastanawiasz się, jak tego uniknąć? – Princess

+2

Prawidłowym sposobem byłoby oczywiście użycie różnych portów. Ale miałem szczęście w używaniu innego adresu IP pętli lokalnej localhost (127.0.0.5) z ekspresowym ('express(). Listen (80, '127.0.0.5')') zamiast http. – laggingreflex

+1

@Princess - może istnieć tylko jeden słuchacz na port dla danego adresu IP. – jfriend00

Powiązane problemy