3

シンプルなチャットアプリを作成しました。そのため、私はnode.jsを使用しました。ネット上で多くの単純な例を見てきましたが、すべてコードが正常に機能していると言っています。しかし、そのコードを試してみると、適切な結果が得られません。

「トランスポートを破棄しています」というエラーをスローしています

私は次のページを読みました: 1) socket.io で RedisStore を使用する例 2) http://www.ranu.com.ar/2011/11/redisstore-and-rooms-with-socketio.html 3) socket.ioブロードキャスト機能と Redis pub/sub アーキテクチャ 4)クラスター化された node.js/socket.io/redis pub/sub アプリケーション などで重複したメッセージを受信して​​います...

以下は私のコードです:

サーバー側コード: app.js ~~~~~~~~~~~~~~~~~~~~~~~~

var app = express.createServer();
app.listen(process.env.PORT);

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

var store = redis.createClient();
var pub = redis.createClient();
var sub = redis.createClient();

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

io.configure(function () {

    //    io.enable('browser client minification');  // send minified client
    //    io.enable('browser client etag');          // apply etag caching logic based on version number
    //    io.enable('browser client gzip');          // gzip the file

    io.set('log level', 3);
    io.set("transports", ["jsonp-polling", "xhr-polling", "websocket", "flashsocket", "htmlfile"]);
    io.set("polling duration", 10);
    io.set("flash policy server", false);
    io.set("connect timeout", 500);
    io.set("reconnect", true);
    //    io.set('close timeout', 60 * 60 * 24); // 24h time out
    io.set('close timeout', 25);
    io.disable('heartbeats');
    io.set('heartbeat interval', 20);
    io.set('heartbeat timeout', 60);
    //    io.set("polling duration", 10);
    //    io.set("heartbate timeout", 30);
    //console.log("blabla");

    //var RedisStore = require('socket.io/lib/stores/redis');
    //io.set('store', new RedisStore({ redisPub: pub, redisSub: sub, redisClient: store }));
    //io.set('store', new RedisStore());
});

io.sockets.on('connection', function (client) {

    client.on("OnConnect", function (data, fn) {
        console.log("socket id : " + client.id + " connected !!!");
    });

    client.on('disconnect', function () {
        console.log("\r\nmanish from server->disconnect");
        //        client.broadcast(client.sessionId + " disconnected")
        client.emit('user disconnected');
        sub.unsubscribe("chat");
        sub.quit();
    });

    sub.subscribe("chat");
    sub.on("message", function (channel, message) {
        console.log("message received on server from publish : '" + message + "'");
        client.send(message);
    });
  });
});

クライアント側コード : index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        this.Connect = function (nick, room) {
            socket = io.connect('http://XXX.XXX.X.XX', { transports: ['jsonp-polling', 'xhr-polling'] });
            Nickname = nick;
            Room = room;

//            setInterval(function () { socket.emit("keep-alive", null) }, 20 * 1000);

            socket.on('connect', function (data) {
                socket.emit('OnConnect', { nick: nick, room: room }, function (response) {
                    $("#board").append("<p>" + response.msg + "</p>");
                });
            });

            socket.on("message", function (msg) {
                alert("message received on client ...");
                $("#board").append("<p>" + msg +"</p>");
            });

            server.on("listening", function () {
                var address = server.address();
                console.log("server listening " + address.address + ":" + address.port);
            });

            socket.emit("message", { msg: msg, nick: Nickname }, function (response) {
                $("#board").append("<p> send message : " + Nickname + ": " + msg + "</p>");
            });

        };

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~しかし、それは私のために働いていません。

このアプリを 1 つのブラウザーで実行していることを意味します (Firefox と言って、IE と言って 2 番目の接続にメッセージを送信します)。

しかし、console.logに次のエラーが表示されます

デバッグ: リクエスト GET の設定 /socket.io/1/jsonp-polling/Th9U-Zci8cVb5Wfwl24Y?t=1345123231804&i=0 デバッグ: クライアント Th9U-Zci8cVb5Wfwl24Y ソケット ID のクローズ タイムアウトを設定します: Th9U-Zci8cVb5Wfwl24Y が接続されました !!! パブリッシュからサーバーで受信したメッセージ: 'msg 1' デバッグ: 設定要求 GET /socket.io/1/jsonp-polling/Th9U-Zci8cVb5Wfwl24Y?t=1345123231804&i=0 デバッグ: ポーリング タイムアウトの設定 デバッグ: デバッグが許可されたクライアント: ポーリングのクリアタイムアウト デバッグ: jsonppolling 書き込み io.j0; デバッグ: クライアント Th9U-Zci8cVb5Wfwl24Y ソケット ID のクローズ タイムアウトを設定します: Th9U-Zci8cVb5Wfwl24Y が接続されました !!! パブリッシュからサーバーで受信したメッセージ: 'msg 1' デバッグ: クライアント Th9U-Zci8cVb5Wfwl24Y のクローズ タイムアウトが発生しました 情報:

4

1 に答える 1

2

Socket.ioルームは、redisなどをサブスクライブする必要がなく、箱から出してすぐに使用できます。

カスタム接続機能を試してみてください

client.on("OnConnect", function (data, fn) {
    console.log("socket id : " + client.id + " connected !!!");
    client.join(data.room);
});

また、部屋から退会する必要はありませんが、退会すると次のようになります。

client.on('disconnect', function () {
    console.log("\r\nmanish from server->disconnect");
    client.emit('user disconnected');
    client.leave("chat");
});

チャットルームへのメッセージの送信は、client.broadcast.to('chat')。emit('message');を使用して行われます。

部屋の詳細については、https://github.com/LearnBoost/socket.io/wiki/Roomsをご覧ください。

幸運を!

于 2012-10-06T15:40:22.357 に答える