尝试在专用服务器上实现 Node.js 和 Socket.io
Posted
技术标签:
【中文标题】尝试在专用服务器上实现 Node.js 和 Socket.io【英文标题】:Trying to Implement Node.js and Socket.io on dedicated server 【发布时间】:2013-08-19 16:29:14 【问题描述】:最近,我一直在试验 Node.js 和 Socket.io。成功地,我已经能够实现这些,但只能在本地主机上。现在我想在我的专用服务器上使用这个功能。我在我自己的家中托管我的服务器,我无法让节点和套接字在本地主机之外运行。这样做的重要性在于,我可以在测试我的站点时使用两台不同的计算机。这是我的代码如下:
app.js:
var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);
server.listen(80);
app.get('/', function (req, res)
res.sendfile(__dirname + '/index.html');
);
io.sockets.on('connection', function (socket)
socket.emit('news', hello: 'world' );
socket.on('my other event', function (data)
console.log(data);
);
);
index.html:
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('news', function (data)
console.log(data);
socket.emit('my other event', my: 'data' );
);
</script>
这些是直接从 socket.io 站点获取的样本。现在它可以在本地主机上运行,但不能在外部运行。我无法在另一台计算机上使用它。有人建议我改变
var socket = io.connect('http://localhost:8080');
到
var socket = io.connect('http://mydomain.com:8080');
,但这会使浏览器抛出以下错误:
Uncaught ReferenceError: io is not defined mydomain.com/:3
GET http://mydomain.com/socket.io/socket.io.js mydomain.com/:1
甚至在我的主服务器计算机上。顺便说一句,我正在使用带有 mac mini 的 OSX 服务器。
任何建议将不胜感激:
【问题讨论】:
【参考方案1】:看起来您正在侦听端口 80 而不是 8080,您需要将脚本块指向您的服务器,因此请尝试
<script src="http://localhost:8080/socket.io/socket.io.js"></script>
需要
<script src="http://mydomain.com:80/socket.io/socket.io.js"></script>
或者更好
<script src="/socket.io/socket.io.js"></script>
如果这不起作用,请确保检查调试器窗口的网络选项卡下的任何错误(假设您使用的是 chrome),以确保您正确加载了该 socket.io.js 文件。
【讨论】:
【参考方案2】:如果与加载js的地方相同,则无需指定服务器地址:
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
socket.on('news', function (data)
console.log(data);
socket.emit('my other event', my: 'data' );
);
</script>
但您需要为您的浏览器提供http://mydomain.com/socket.io/socket.io.js。
【讨论】:
按照您的建议做了,现在我收到此错误:“GET mydomain.com/socket.io/1/?t=1376958569564 404(未找到)”基本上,我的根文件夹包含 /socket.io/socket.io.js 解决了初始问题。【参考方案3】:好的。尝试运行这段代码:
文件名:package.json
"name": "test-socketio"
, "version": "0.0.1"
, "private": true
, "dependencies":
"socket.io": "*"
,
"engines":
"node": "0.8.x"
,"npm" : "*"
文件名:app.js
var express = require('express')
, app = express()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);
server.listen(80);
app.get('/', function (req, res)
res.sendfile(__dirname + '/index.html');
);
io.sockets.on('connection', function (socket)
socket.emit('news', hello: 'world' );
socket.on('my other event', function (data)
console.log("Recevied: 'my other event'");
console.log(data);
);
);
文件名:index.html
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
socket.on('news', function (data)
console.log("Received news event");
console.log(data);
socket.emit('my other event', my: 'data' );
);
</script>
然后在代码目录下运行:
npm install
然后运行:
sudo node app.js
请记住,您需要拥有 root 权限才能开始侦听端口 80。
【讨论】:
我尝试按照您的规格再次尝试,我在终端收到以下信息:info - socket.io started warn - error raised: Error: listen EADDRINUSE
其他东西已经在监听 80 端口。您必须先关闭该服务。
嗨 Luman 75,我正在使用 MAC OSX 服务器,我的站点通过端口 80 启动并运行。如果我关闭端口 80,鉴于套接字可以连接,我将无法访问我的地点。我需要做某种端口转发吗?
什么当前占用了你的 80 端口?
OSX 服务器正在使用我的端口 80 来处理传入流量。因此,我认为您要寻找的答案基本上是我的站点本身(如果路由到端口 80)。以上是关于尝试在专用服务器上实现 Node.js 和 Socket.io的主要内容,如果未能解决你的问题,请参考以下文章
利用forever在Linux上实现Node.js项目自启动
Cisco 路由器上配置Easy虚拟专用网(解决员工出差访问公司内网)