gpt4 book ai didi

javascript - node.js + socket.io + express.js : No connection

转载 作者:搜寻专家 更新时间:2023-11-01 00:10:49 24 4
gpt4 key购买 nike

我一直在尝试设置一个简单的 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>

最佳答案

好的伙计们,我终于启动并运行了它。

我所做的是将我的反向代理从 Apache 迁移到 node.js/node-http-proxy-solution。我不确定这是否真的是强制性的——但在重新配置 Apache 2.2.2 甚至编译 Apache 2.4.7 都没有帮助之后,我认为它可能值得一试。我还切换到子域而不是子目录,因为子目录在某些情况下似乎也会引起问题。同样,不知道这是否只是一种预防措施,或者这是否真的有必要。

然而,我非常确定相关的是如何加载 socket.io.js。由于我的反向代理已经将请求转发到正确的(内部)IP,因此我必须通过不带端口的 TLD 或 ws://访问 socket.io.js 和实际的 Websocket。

长话短说,这里是相关代码:

服务器

var express = require('express');
var app = express();
var server = app.listen(3000);
var io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/'));

console.log('Express server started on port %s', app);

io.sockets.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});

客户端

<script src="http://mysubdomain.mydomain.com/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://mysubdomain.mydomain.com');
// , {secure: true}

socket.on('news', function(data) {
console.log(data);
});
</script>

代理

var fs = require('fs'), httpProxy = require('http-proxy');

// This will crash as soon as Apache isn't running or the port isn't binded elsewhere
// TODO: fix
var proxyTable = {
'mydomain.com/subdir' : '127.0.0.1:3000',
'mysubdomain.mydomain.com' : '127.0.0.1:3000'
};

var httpOptions = {
hostnameOnly : false,
router : proxyTable
};

var httpsOptions = {
hostnameOnly : false,
router : proxyTable,
https : {
key : fs.readFileSync('/path/key', 'utf8'),
cert : fs.readFileSync('/path/cert', 'utf8')
}
};

httpProxy.createServer(httpOptions).listen(80);
httpProxy.createServer(httpsOptions).listen(443);

最后但同样重要的是,对于通过谷歌偶然发现的任何人,使用的版本:

$ npm list --depth=0
myapp@0.0.0 /path/app
├── express@3.4.7
└── socket.io@0.9.16

$ npm list --depth=0
/path/proxy
└── http-proxy@0.10.4

关于javascript - node.js + socket.io + express.js : No connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20903719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com