Socket.io 本地网络无法连接

5
好的,我有以下设置:https://istack.dev59.com/4T9SX.webp(如果下面的图片太小)。

enter image description here

问题在于电脑2无法通过socket.io连接到电脑1。

enter image description here

是的,我在电脑2中包含了socket.io:

enter image description here

任何想法为什么当ping可以时,socket.io不能连接到计算机1上的计算机2?
额外信息: - Socket.io版本1.4.5 - 两台计算机都是Windows10 - 计算机2的JavaScript在Phonegap中 - 计算机2通过Wi-Fi连接,计算机1通过以太网连接
问候
编辑 客户端代码(计算机2,init在启动时调用):
KerstAppHome.prototype.init = function(){
    var address = 'http://192.168.2.120:2017';
    console.log("Connecting to: " + address);
    this.socket = io.connect(address);
    this.socket.on('connect', this.proxy(function(){
        console.log("Connected to socket!");
        this.socketIsConnected = true;

        this.socket.on('disconnect', this.proxy(function(){
            console.log("Disconnected from socket!")
            this.socketIsConnected = false;
        }));
        this.socket.on('musicBlob', this.proxy(this.onMusicBlobReceived))
    }));

};

KerstAppHome.prototype.onMusicBlobReceived = function(musicBlob){
    console.log("RECEIVED SOMETHING");
    this.audioCtx.decodeAudioData(musicBlob).then(this.proxy(function(audioBuffer) {
        var source = this.audioCtx.createBufferSource();
        source.buffer = audioBuffer;
        source.connect(this.audioCtx.destination);
        source.start();
    }));
}

来自服务器的代码(计算机1):

var port = 2017;
var io = require('socket.io')(port);
console.log("Listening for socket connections on port " + port);

io.on('connection', function (socket) {
    console.log("Connection made!");
    socket.on('musicBlob', function(musicBlob){
        socket.broadcast.emit('musicBlob', musicBlob);
    });
});

来自浏览器的相关代码(计算机1):

var socket = io.connect('http://localhost:2017');
var socketIsConnected = false;

socket.on('connect', function(){
    console.log("Connected to server!");
    socketIsConnected = true;
});
socket.on('disconnect', function(){
    console.log("Disconnected from server!")
    $scope.socketIsConnected = false;
});

我想知道为什么电脑2甚至无法连接到服务器,控制台中的console.log("Connected to socket!");甚至没有被调用。
注意:如果我在电脑1上执行客户端(电脑2)的javascript代码,则完美运行,建立连接并接收数据!
注意:我测试了电脑1(服务器),关闭了它的防火墙,完美地运行了!

你能试一下不同的端口吗?可能是防火墙设置阻止了连接吗? - user835611
1
当服务器运行时,您能否发布两台计算机的 netstat -ant 输出?可能是 socket.io 服务器正在侦听与面向网络的不同接口。 netstat 输出将提供更多详细信息。 - Surojit
@nicovank关闭了计算机1(服务器计算机)的防火墙,它起作用了!有何想法?如何在不关闭整个防火墙的情况下解决这个问题? - ErikBrandsma
1
@user835611 确实是防火墙的问题!为了测试,在计算机1上关闭了防火墙,它完美地工作了。现在我不想关闭整个防火墙,你有什么解决办法吗? - ErikBrandsma
@ErikBrandsma 请标记答案。 - Vinay Pandya
显示剩余13条评论
2个回答

3
请检查您的防火墙设置,或关闭几分钟后再尝试,同时确保两台计算机连接到相同的局域网/ WiFi。并允许通过Windows防火墙传输phonegap、Evented I/O和v8 JavaScript和Secure Socket Tunneling Protocol。

搞定了!谢谢!希望你的答案能帮助很多人解决这个问题 :D - ErikBrandsma
@ErikBrandsma 是的,我希望它能帮助到其他人。 - Vinay Pandya

1

关于您在图像中引用代码的问题 - 您需要首先检查以下内容:

  1. 您的nodejs公开url是什么,例如localhost:2017 - 如果您将其设置为localhost,则您的节点服务器正在运行为本地主机名和IP 127.0.0.1的uri,无法从另一台计算机访问 - 如果是这种情况,则需要将实际IP分配给节点进程192.168.2.120(在您的情况下),然后才能从另一台计算机访问它
  2. 最好为socket.io连接过程使用命名空间
  3. 您是否使用Windows计算机? 您需要打开网络和共享中心 - 如果您连接到公共网络,则连接永远不会起作用 - 至少运行nodejs服务器的计算机应该连接到家庭或办公室网络

如果您仍然遇到问题,可以参考以下代码启动服务器

const http = require('http');
const url = '192.168.2.120';
var port = 2017;

console.log("Listening for socket connections on port " + port);

var requestListener = function (req, res) {
     res.writeHead(200);
     res.end('Hello, World!\n');
}

var server = http.createServer(requestListener);
var io = require('socket.io')(server);

server.listen(port,url);

console.log('Server running at:', url+':'+port);

io.on('connection', function (socket) {
    console.log("Connection made!");
    socket.on('musicBlob', function(musicBlob){
    socket.broadcast.emit('musicBlob', musicBlob);
});

这对你应该有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接