我有一个运行IIS的Windows服务器和带有socket.io的node.js,用于我正在开发的交互式白板应用程序。我希望IIS网站和node.js服务器都能侦听端口80,但是绑定到不同的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);
我收到错误:启动修改后的代码时听取EACCES
答案 0 :(得分:7)
我看到没有人接听,所以我会发布这个,不确定它是否会对你有所帮助:
var io = require('socket.io');
var server = http.createServer();
server.listen(8080, 'localhost');
var socket = io.listen(server);
基本上只是将呼叫切换为listen。
答案 1 :(得分:0)
我明白了!
问题实际上在于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。