我刚开始使用node.js几天前,我知道尝试使用socket.io模块。但它并没有像我期待的那样发挥作用。我试图重现的例子是这样的: http://robdodson.me/blog/2012/06/04/deploying-your-first-node-dot-js-and-socket-dot-io-app-to-heroku/
我知道他们使用的Express版本已经过时,所以我更新了我的代码以适应他们正在使用的新版本的模块。
我遇到的问题是我的客户端没有得到我的服务器发出的内容,这是我的服务器端代码:
var express = require('express'),
http = require('http'),
app = express(),
port = 8080, // Use 8079 for dev mode
server = http.createServer(app).listen(process.env.PORT || port, function(){
console.log('Express server listening on port %d in %s mode', server.address().port, app.settings.env);
}),
io = require('socket.io').listen(server),
routes = require('./routes');
// Configuration
app.configure(function() {
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function() {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function() {
app.use(express.errorHandler());
});
// Heroku won't actually allow us to use WebSockets
// so we have to setup polling instead.
// https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
// Routes
app.get('/', routes.index);
var status = "All is well.";
io.sockets.on('connection', function (socket) {
io.sockets.emit('status', { status: status }); // note the use of io.sockets to emit but socket.on to listen
socket.on('reset', function (data) {
status = "War is imminent!";
io.sockets.emit('status', { status: status });
});
});
这是客户端:
<script src="http://localhost:8080/socket.io/socket.io.js">
var socket = io.connect(document.location.href);
</script>
<div id="status"></div>
<button id="reset">Reset!</button>
所以,如果我理解得很好,那么在状态div中第一次得到的就是“一切都很好”,“战争迫在眉睫!”如果我点击重置。 但我得到的一切都没有。
我尝试了这些答案,但我看不出解决方案代码和我的解决方案之间存在任何差异,或者有时它只是过时了: 1. Node.js + socket.io: app on server not working correctly 2. NodeJS - Socket.IO Setup: served static content no handshake (Ubuntu on Rackspace Cloud Server)
我尝试了其他科目中提供的所有解决方案,但它绝对不适合我。 每个模块都已正确安装。我首先按照我所遵循的教程中给出的步骤进行操作。 如果有人知道发生了什么,或者是否有人遇到过同样的问题,欢迎你。
感谢。
答案 0 :(得分:3)
您的客户没有做任何事情的原因是因为您没有告诉它做任何事情。您需要为其分配处理程序以执行某些操作。因此,要解决这个问题,您需要在点击时告诉reset
按钮使用socket.emit()
,并且您还需要按顺序为status
事件分配处理程序更改div
。
<script type="text/javascript" src="http://localhost:8080/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect(document.location.href);
</script>
<div id="status"></div>
<button id="reset" onclick="socket.emit('reset')">Reset!</button>
<script type="text/javascript">
socket.on('status', function(data) {
document.getElementById('status').innerHTML = data.status;
});
</script>