Node.js - Socket.io只能通过localhost访问

时间:2016-06-22 20:03:15

标签: javascript node.js sockets socket.io

当我运行我的Node.js脚本时,我只能使用localhost:8083访问它,而使用来自其他设备的机器的IP地址会导致"无法访问此站点&#34 ;。我使用以下Node.js 服务器脚本

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);

以下是客户端脚本

<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>

编辑:修改了端口,但它们不是问题。当我将var socket = io.connect更改为io()时,它就有效了。

3 个答案:

答案 0 :(得分:1)

这可能是您的服务器(和/或网络)防火墙的问题,而不是节点问题。每当您需要在服务器上使用新端口时,您都需要打开任何防火墙以允许流量到该端口。

一个好的起点是将端口扫描实用程序(例如nmap)下载到尝试连接的客户端。然后将该实用程序指向服务器,以查看打开的端口。

一旦您确认它是端口问题,请在机器的防火墙上打开该端口。之后,如果您仍无法联系本机,则网络防火墙可能会阻止流量到达服务器。

如果您仍然无法弄明白,那么您希望从网络专家(而非我的专业领域)获得一些建议,因此请考虑在Network Engineering下发布问题。另外,考虑在上面的代码中添加一些错误处理;如果不是防火墙问题,它可能会帮助您找出问题究竟是什么。

希望有所帮助, ~Nate

答案 1 :(得分:1)

您无需在客户端呼叫connect,当客户端被提供socket.io.js时,它将尝试自动连接到服务文件的服务器,并通过呼叫到io();

编辑:

var socket = io();

一旦客户端被提供了socket.io.js,这就是你需要调用的全部内容。在此示例中,socket将是连接到服务器的套接字对象。

看看this简单示例。您可以看到,在客户端示例中,他们只会var socket = io();连接回服务器。

答案 2 :(得分:1)

客户端和服务器端口应匹配(8081和8083不要):)