2016-06-22 6 views
0

Wenn ich mein Node.js-Skript ausführe, kann ich nur mit localhost: 8083 darauf zugreifen, während die Verwendung der IP-Adresse des Geräts von einem anderen Gerät zu einem "Diese Seite kann nicht sei erreicht". Ich bin mit dem folgenden Node.js Server-Skript:Node.js - Socket.io nur über localhost erreichbar

var app = require('express')(), 
    server = require('http').createServer(app), 
    io = require('socket.io').listen(server), 
    ent = require('ent'), // Blocks HTML characters (security equivalent to htmlentities in PHP) 
    fs = require('fs'); 

// Loading the page index.html 
app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function (socket, username) { 
    // When the username is received it’s stored as a session variable and informs the other people 
    socket.on('new_client', function(username) { 
     username = ent.encode(username); 
     socket.username = username; 
     socket.broadcast.emit('new_client', username);(err) {}); 
    }); 

    // When a message is received, the client’s username is retrieved and sent to the other people 
    socket.on('message', function (message) { 
     message = ent.encode(message); 
     socket.broadcast.emit('message', {username: socket.username, message: message}); 
    }); 
}); 
console.log('Chat Socket.io running on port 8083'); 
server.listen(8083); 

Hier ist der Client Skript:

<script src = "http://code.jquery.com/jquery-1.10.1.min.js" > </script> 
<script src="/socket.io/socket.io.js "></script> 
<script> 
    // Connecting to socket.io 
    var socket = io.connect("10.254.17.115:8083"); 

    // The username is requested, sent to the server and displayed in the title 
    var username = prompt('What\'s your username?'); 
    socket.emit('new_client', username); 
    document.title = username + ' - ' + document.title; 

    // When a message is received it's inserted in the page 
    socket.on('message', function(data) {insertMessage(data.username, data.message)}) 

    // When a new client connects, the information is displayed 
    socket.on('new_client', function(username) { 
    $('#chat_zone').prepend(
     '<p><audio class="background" autoplay><source src="new-user.mp3" type="audio/wav"></audio><em>' + username + ' has joined the chat!</em></p>'); 
    }) 

    // When the form is sent, the message is sent and displayed on the page 
    $('#chat_form').submit(function() { 
     var message = $('#message').val(); 
     socket.emit('message', message); // Sends the message to the others 
     insertMessage(username, message); // Also displays the message on our page 
     $('#message').val('').focus(); // Empties the chat form and puts the focus back on it 
     return false; // Blocks 'classic' sending of the form 
    }); 

    // Adds a message to the page 
    function insertMessage(username, message) { 
     $('#chat_zone').prepend('<p><strong>' + username + '</strong> ' + message + '</p>'); 
    } 
</script> 

Edit: Überarbeitete Häfen, aber sie waren nicht das Problem. Als ich die var socket = io.connect zu io() änderte, funktionierte es.

+0

Ist die Maschine auf diesem Port die Socket.IO Server erlauben, eingehende Verbindungen laufen? Vielleicht blockiert die Firewall diese Anfragen. – arthurakay

+1

Warten Sie, warum versucht Ihr Clientskript, eine Verbindung mit Port 8081 herzustellen, wenn der Server unter 8083 ausgeführt wird? – arthurakay

+0

'' mit Leerzeichen? –

Antwort

1

Sie brauchen nicht connect auf der Client-Seite aufrufen, wenn der Client socket.io.js serviert wird, wird versucht, automatisch mit dem Server zu verbinden, von dem die Datei serviert wurde , mit einem Aufruf an io();

Edit:

var socket = io(); 

Sobald der Kunde die socket.io.js serviert wurde, das ist alles, was Sie anrufen müssen. socket ist Ihr Socket-Objekt, das in diesem Beispiel mit dem Server verbunden ist.

Werfen Sie einen Blick auf this einfaches Beispiel. Sie können sehen, dass sie in ihren clientseitigen Beispielen nur var socket = io(); zurück zum Server verbinden.

1

Dies ist wahrscheinlich ein Problem mit der Firewall Ihres Servers (und/oder Netzwerks), nicht mit dem Knoten. Jedes Mal, wenn Sie einen neuen Port auf Ihrem Server verwenden müssen, müssen Sie alle Firewalls öffnen, um den Datenverkehr zu diesem Port zu ermöglichen.

Ein guter Ausgangspunkt wäre, ein Dienstprogramm zum Scannen von Ports (z. B. nmap) auf den Client herunterzuladen, der versucht, eine Verbindung herzustellen. Zeigen Sie dann das Dienstprogramm auf den Server, um zu sehen, welche Ports geöffnet sind.

Sobald Sie bestätigen können, dass es sich um ein Problem mit dem Anschluss handelt, öffnen Sie diesen Anschluss in der Firewall des Geräts. Wenn Sie den Computer danach immer noch nicht erreichen können, verhindert eine Netzwerkfirewall möglicherweise, dass der Datenverkehr den Server erreicht.

Wenn Sie es immer noch nicht herausfinden können, sollten Sie einen Rat von einem Netzwerkexperten (nicht meinem Fachgebiet) bekommen, also überlegen Sie, eine Frage unter Network Engineering. Erwägen Sie auch, dem obigen Code eine Fehlerbehandlung hinzuzufügen. Es kann Ihnen helfen, herauszufinden, was genau das Problem ist, wenn nicht ein Firewall-Problem.

Hoffnung, die hilft, ~ Nate

1

Client- und Server-Ports sollten (8081 und 8083 tun sie nicht) passen :)