2

私は数日前に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の最初の「All is well」と「War is imminent !」が得られるはずです。リセットをクリックすると。しかし、私が得るのは何もありません。

私はそれらの答えを試しましたが、ソリューションコードと私のものの間に違いが見られないか、時代遅れになっている場合があります: 1. Node.js + socket.io: サーバー上のアプリが正しく機能してい ませんハンドシェイクなしで静的コンテンツを提供 (Rackspace Cloud Server 上の Ubuntu)

他の科目で与えられたすべての解決策を試しましたが、うまくいきません。すべてのモジュールが正しくインストールされています。最初に従ったチュートリアルの手順に従いました。誰かが何が起こっているのか、または誰かが同じ問題を経験したことがわかっている場合は、大歓迎です.

ありがとう。

4

1 に答える 1

3

クライアントが何もしないのは、あなたがクライアントに何もするように指示していないからです。何かを行うには、ハンドラーを割り当てる必要があります。したがって、これを修正するには、クリックされたときにreset使用するようにボタンを指示する必要があり、.socket.emit()statusdiv

<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>
于 2013-10-27T02:30:23.963 に答える