【发布时间】:2014-01-03 12:30:28
【问题描述】:
我一直在尝试设置一个简单的 socket.io 示例,但它拒绝正常工作。客户端在 Apache2 上运行,应该通过 3000 端口访问 node.js-server。
似乎没有 任何 连接,并且服务器是否实际运行似乎并不重要 - 如果在服务器上手动停止 node.js 进程($ kill xyz ),我的客户端控制台不会引发任何错误。应用运行时会出现完全相同的结果 (info - socket.io started)。
服务器:
// Check dependencies & setup backend
var express = require('express');
var server = express();
var http = require('http');
var app = http.createServer(server); // somehow needed? ("Socket.IO's `listen()` method expects an `http.Server` instance as its first parameter.")
var socket = require('socket.io');
// listen @ port 3000 as definied by proxy
server.listen(3000);
// listen w/ socket.io as well
var io = socket.listen(app);
...
// socket.io
// TODO: test, added 01/03/14
io.set('match origin protocol', true);
io.set('log level', 2);
var clients = io.sockets.clients();
io.sockets.on('connection', function(client) {
console.log('Connection from ' + client);
client.emit('news', {
hello : 'world'
});
client.on('event', function(data) {
console.log(data);
});
});
客户:
<script type="text/javascript" src="./js/socket.io.js" ></script>
<script>
try {
var socket = io.connect('https://localhost:3000');
console.log(io);
console.log('check 1', socket.socket.connected); // false
socket.on('connect', function() {
console.log('check 2', socket.socket.connected); // not reached
});
socket.on('news', function(data) {
console.log(data);
});
} catch(error) {
console.log(error);
} finally {
console.log('fin');
}
</script>
编辑 2:
此代码有效,但仅在本地。我什至在服务器上安装了 Apache 2.4 以确保我可以访问 WebSockets(我在某处读到它们在 2.2.x 中不可用)。 服务器:
var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);
app.use(express.static(__dirname + '/'));
io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});
客户:
<script type="text/javascript" src="js/socket.io.js" ></script>
<script>
var socket = io.connect('ws://localhost:3000');
socket.on('news', function(data) {
console.log(data);
socket.emit('my other event', {
my : 'data'
});
});
</script>
【问题讨论】:
-
您的服务器端代码应该使用
app.listen(而不是server.listen)。您的客户端应该使用:src="/socket.io/socket.io.js"。如果您还想为 Apache 启用 websocket,请查找有关它的文档 -
我不能简单地使用socket.io/socket.io.js,因为客户端存储在/var/www/xyz,而node.js 位于/var/node。所以我只是将它复制到正确的位置:
$ ./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js $ cp ./node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js /var/www/xyz/js。 Websockets 似乎在 Apache 2.2 中不可用,建议的解决方案似乎只使用 xhr-polling。不幸的是,这也不起作用。
标签: javascript node.js apache express socket.io