Javascript node.js+;socket.io+;express.js:没有连接
我一直在尝试设置一个简单的socket.io示例,但它无法正常工作。客户端在Apache2上运行,应该通过端口3000访问node.js-server 似乎没有任何连接,服务器是否实际运行也无关紧要-如果在服务器上手动停止node.js-process(Javascript node.js+;socket.io+;express.js:没有连接,javascript,node.js,apache,express,socket.io,Javascript,Node.js,Apache,Express,Socket.io,我一直在尝试设置一个简单的socket.io示例,但它无法正常工作。客户端在Apache2上运行,应该通过端口3000访问node.js-server 似乎没有任何连接,服务器是否实际运行也无关紧要-如果在服务器上手动停止node.js-process($kill xyz),我的客户端控制台不会抛出任何错误。应用程序运行时会出现完全相同的结果(info-socket.io已启动) 服务器: // Check dependencies & setup backend var express
$kill xyz
),我的客户端控制台不会抛出任何错误。应用程序运行时会出现完全相同的结果(info-socket.io已启动
)
服务器:
// 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>
客户端:
// 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>
客户端:
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>
var socket=io.connect('ws://localhost:3000');
socket.on('news',函数(数据){
控制台日志(数据);
socket.emit('my other event'{
我的:“数据”
});
});
请遵循以下示例:
此外,这是错误的:
io.connect('https://localhost:3000');
应该是
ws://localhost:3000/
好了,伙计们,我终于把它安装好并运行了
我所做的是将我的反向代理从Apache迁移到node.js/node-http-proxy-solution。我不确定这是否是强制性的——但在重新配置Apache2.2.2,甚至编译Apache2.4.7都没有帮助之后,我认为这是值得一试的。我还切换到了子域而不是子域,因为子域在某些情况下似乎也会导致问题。同样,不知道这是否只是一种预防措施,或者这是否真的是必要的
然而,我非常确定的是如何加载socket.io.js。因为我的反向代理已经将请求转发到正确的(内部)IP,所以我必须通过TLD w/o端口或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>
最后但并非最不重要的一点是,对于任何通过谷歌偶然发现这一点的人来说,使用的版本包括:
$ 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
撇开变量名不谈:这似乎与我的设置非常相似,并产生相同的错误。添加了更多。老兄,老实说你做错了太多事情了。所以,请从简单的例子开始,不断改进。但从简单开始。如果调用app.listen(),app将创建一个内部http服务器,因此
server
和io
对象是无意义的(?)app-指向extress。expressit本身依赖于http。如果您调用http.createServer
,它会将http套接字连接到app
(express),以便下次调用socket.listen
将绑定到同一个http服务器。当你调用app.listen时,那个家伙会使用我们之前创建的http服务器。所以他们都有关联。请检查我在答案中提供的链接中的默认示例,并与它们一起玩以进一步理解。这些示例都不起作用。给定的express.js+socket.io示例参考的是Express2.0,github上的“新”文档针对的是未发布的1.0版本。在我的Mac上设置新的本地项目w/npm install socket.io express
w/初始化服务器的代码(因为官方示例不起作用)及其index.html示例,我得到的只是“NetworkError:404未找到-http://127.0.0.1:8020/socket.io/socket.io.js“
。此外,ws://-协议的使用也没有提到。我现在真的很困惑。你的服务器端代码应该使用app.listen
(而不是server.listen
)。您的客户端应该使用:src=“/socket.io/socket.io.js”。如果您还想为Apache启用websocket,那么让我们来查找关于itI的文档,因为客户端存储在/var/www/xyz中,而node.js位于/var/node中,所以不能简单地使用socket.io/socket.io.js。因此,我只是将它复制到了正确的位置:$./node\u modules/socket.io/node\u modules/socket.io-client/dist/socket.io.js$cp./node\u modules/socket.io/node\u modules/socket.io-client/dist/socket.io.js/var/www/xyz/js
。WebSocket似乎在Apache2.2中不可用,建议的解决方案似乎只使用xhr轮询。不幸的是,这也不起作用。使用nginx代理是无痛且直接的-最新版本在默认情况下支持WebSockets流量代理,因此它与node.js一起工作会更好、更高效。事实上,您的socket.io连接可能只使用XHR长轮询,而不是WebSockets,因为Apache可能不知道如何处理WS-traffic。仔细检查这一点,因为在这种情况下,你会失去很多网络性能。感谢你发布这篇文章,我有同样的错误,你的例子帮助了我!