socket.io绑定到特定的IP地址

socket.io绑定到特定的IP地址

问题描述:

我有一个Windows服务器运行IIS和node.js与socket.io为我正在开发的交互式白板应用程序。我希望IIS网站和node.js服务器都侦听端口80,但绑定到不同的IP地址。socket.io绑定到特定的IP地址

从我能找到的,socket.io不具备指定IP地址的能力。这种限制可以通过创建一个http服务器实例来解决。我是socket.io和node.js的新手,并且试图做到这一点有点遗憾。我将包含原始服务器代码(在特定端口上侦听)以及我尝试在特定IP地址上实例化服务器。

原始

(function() { 
    var io; 
    io = require('socket.io').listen(80); 
    io.sockets.on('connection', function(socket) { 
    socket.on('drawClick', function(data) { 
     socket.broadcast.emit('draw', { 
     x: data.x, 
     y: data.y, 
     type: data.type 
     }); 
    }); 
    }); 
}).call(this); 

修改

(function() { 
    var host = "10.70.254.76"; 
var port = 80; 

var http = require("http").createServer(); 
var io = require("socket.io").listen(http); 

http.listen(port, host); 
io.sockets.on('connection', function(socket) { 
    socket.on('drawClick', function(data) { 
     socket.broadcast.emit('draw', { 
      x: data.x, 
      y: data.y, 
      type: data.type 
     }); 
    }); 
}); 
}).call(this); 

我得到错误:启动修改后的代码

+0

好吧,我的修改后的代码工作,如果我设置端口为8080.我得到EACCES错误,当我尝试使用80 – TylerEKnight 2012-02-23 21:18:35

+0

端口80是禁止的因为它属于sudoers(root用户),你可以使用“sudo node app.js”来强制它,但这不是好习惯。 – sfiore 2016-09-13 09:43:31

我明白了!

该问题实际上与IIS和它的套接字池行为有关。 IIS会自动为所有IP地址保留端口80(即使它们当前未绑定到站点)。 我所要做的就是使用netsh命令覆盖默认绑定并通过netsh命令绑定ip地址。

这就是我所做的。此解决方案适用于Windows Server 2008 R2中的IIS 7。

netsh http add iplisten ipaddress x.x.x.x 
net stop http 
net start http 
net start w3svc 

在我的情况下,我只有一个活动网站由IIS提供服务,只有一个IP绑定到它。这释放了我的第二个IP地址,让节点在它上面监听端口80.

我看到没人接听时EACCES,所以我会后这个,不知道它会帮助你:

var io = require('socket.io'); 
var server = http.createServer(); 
server.listen(8080, 'localhost'); 
var socket = io.listen(server); 

基本上只是切换通话听。

+0

这是一个权限错误,对吧?它是否工作,如果你把它作为sudo运行?这不是推荐的解决方案。 – mindandmedia 2012-02-23 21:16:01

+0

这里是一个类似的问题的链接:http://stackoverflow.com/questions/9164915/node-js-eacces-error-when-listening-on-most-ports – mindandmedia 2012-02-23 21:27:51

+0

嗯,我使用端口80时EACCES使用修改的方法,但在使用第一种方法(不绑定到特定IP的端口80)使用端口80时,不会出现任何错误。这是一个窗口框,并且该命令以管理员身份运行。 – TylerEKnight 2012-02-23 21:37:11