我一直在这个问题上花费数小时,但无济于事。
编辑:找到解决方案(见我的回答)
项目背景
我正在构建一个项目Symfony2
,它需要一个用于上传大文件的模块。我选择了Node.js
and Socket.IO
(我必须从头开始学习,所以我可能会遗漏一些基本的东西)。我将这些与 HTML5 File 和 FileReader API 结合起来,将文件以切片的形式从客户端发送到服务器。初步测试表明,这种方法作为一个独立的应用程序非常有效,其中所有内容都由 处理和服务Node.js
,但与集成Apache
并Symfony2
似乎存在问题。
该应用程序有一个不安全和安全的部分。我的目标是Apache
在端口上使用80
并443
为内置的大部分应用程序提供服务Symfony2
,并Node.js
在Socket.io
端口上8080
用于文件上传。连接到套接字的客户端页面将由 提供Apache
,但套接字将通过 运行Node.js
。上传模块必须通过 HTTPS 运行,因为页面驻留在具有经过身份验证的用户的安全环境中。
问题是事件使用socket.emit
或socket.send
似乎不起作用。客户端到服务器,或服务器到客户端,没有区别。没有任何反应,也没有错误。
编码
显示的代码是我的代码的简化版本,没有混乱和敏感数据。
服务器
var httpsModule = require('https'),
fs = require('fs'),
io = require('socket.io');
var httpsOptions =
{
key: fs.readFileSync('path/to/key'),
cert: fs.readFileSync('/path/to/cert'),
passphrase: "1234lol"
}
var httpsServer = httpsModule.createServer(httpsOptions);
var ioServer = io.listen(httpsServer);
httpsServer.listen(8080);
ioServer.sockets.on('connection', function(socket)
{
// This event gets bound, but never fires
socket.on('NewFile', function(data)
{
// To make sure something is happening
console.log(data);
// Process the new file...
});
// Oddly, this one does fire
socket.on('disconnect', function()
{
console.log("Disconnected");
});
});
客户
// This is a Twig template, so I'll give an excerpt
{% block javascripts %}
{{ parent() }}
<script type="text/javascript" src="https://my.server:8080/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect("my.server:8080",
{
secure: true,
port: 8080
});
// Imagine this is the function initiating the file upload
// File is an object containing metadata about the file like, filename, size, etc.
function uploadNewFile(file)
{
socket.emit("NewFile", item);
}
</script>
{% endblock %}
所以问题是...
当然,该应用程序还有更多内容,但这就是我被困的地方。页面加载完美,没有错误,但发出事件永远不会触发或到达服务器(断开连接事件除外)。我已经尝试在客户端和服务器上使用消息事件来检查它是否只是自定义事件的问题,但这也不起作用。我猜有些东西阻止了客户端-服务器通信(它不是防火墙,我已经检查过了)。
我在这里完全不知所措,所以请帮忙。