0

このチャットチュートリアルhttp://cestfait.ch/content/chat-webapp-nodejsに従って、簡単なチャットアプリを作成しました。これを、2人のユーザーに制限しようとしました。また、user1idという2つの変数を作成したいと思いました。とuser2id、私はそれらをクライアントのsocket.idにしたいです。

// you set this value when the user1 connects
var user1id;

// you set this value when the user2 connects
var user2id;

// just for visualization, this is one of the questions I have on how to do this.
user1id = socket.id; user2id = socket.id;

2人のユーザーだけが必要で、user1とuser2としてそれらを使用する理由は、それらのメッセージを比較できるようにするためです。したがって、user1とusers2のメッセージの配列が必要です。

user1arr = []; user2arr = [];

次に、たとえばuser1の「currentWord」変数を比較して、user2msgs[]のいずれかに一致するかどうかを確認します。以下のuser1のケースの例:

function receivedWord(userid, currentWord) {

// this means current player is 1
if( userid == user1id ) {

    // adds the word received to user 1 word array
    user1arr.push(currentWord);

    // compares received word with each word in user 2 array
    $.each(user2arr, function(u2word) {
        if(u2word == currentWord) {
            wordsMatch();
        }
    }
}

私のコードは基本的に、この投稿の冒頭で提供したチャットアプリのコードです。

ありがとう。

4

1 に答える 1

1

問題は、ユーザーがページをリロードするたびに、socketIO の socketID が変更されることです。あなたがする必要があるのは、セッションIDのようなものをユーザーに添付して、再接続しても同じユーザーであることを知ることです. nodeJS の非常に柔軟なミドルウェアであるExpressJSconnectのような webframe を調べる必要があります。私はエクスプレスでそのようなことを達成したので、このためのコードを少し紹介しましょう。

//directories
var application_root = __dirname;

//general require
var express = require('express'),
        connect = require('connect'),
        http = require('http'),
        fs = require('fs');

//create express app
var app = express();

//create sessionStore
var sessionStore = new connect.session.MemoryStore();

//setup sessionKey
var secretKey = 'superdupersecret';

//configure express
app.configure(function() {

        //use body parser
        app.use(express.bodyParser());

        //override methods
        app.use(express.methodOverride());

        //cookies and sessions
        // BE AWARE: this lines have to be written before the router!
        app.use(express.cookieParser(secretKey));
        app.use(express.session({
                store: sessionStore,
                secret: secretKey,
                key: 'express.sid'
        }));

        //router
        app.use(app.router);

        //use static page in public folder
        app.use(express.static(path.join(application_root, 'public')));
});


//create the http server link to the new data http object of express 3
server = http.createServer(app);

//make server listen to 8080 and localhost requests
server.listen(8080, 'localhost', function() {
        console.log('Express Server running and listening');
});

//bind socket.io to express server by listening to the http server object
var io = require('socket.io').listen(server);

//set the authorization through cookies 
io.set('authorization', function(data, accept) {

        //check if header data is given from the user
        if (!data.headers.cookie) {

                //return false if no cookie was given
                return accept('Session cookie required!', false);
        }

        //parse cookie into object using the connect method
        //NOTE: this line is a hack, this is due to the fact
        //that the connect.utils.parseCookie has been removed
        //from the current connect module and moved to an own
        //instance called 'cookie'.
        data.cookie = connect.utils.parseSignedCookies(require('cookie').parse(decodeURIComponent(data.headers.cookie)), secretKey);

        //save session id based on exress.sid
        data.sessionID = data.cookie['express.sid'];

        //get associated session for this id
        sessionStore.get(data.sessionID, function(err, session) {
                if (err) {
                        //there was an error
                        return accept('Error in session store.', false)
                } else if (!session) {
                        //session has not been found
                        return accept('Session not found', false);
                }

                //successfully got the session, authed with known session
                data.session = session;

                //return the accepted connection
                return accept(null, true);
        });

});

//connection handler for new io socket connections
io.sockets.on('connection', function(socket) {

        //parse handshake from socket to io
        var hs = socket.handshake;

        //show session information
        console.log('New socket connection with sessionID ' + hs.sessionID + ' connected');

});

コードとコメントを読んで、彼らが何をしているのかを理解してください。基本的に、あなたがやっていることは、Expressサーバーを作成し、socketIOにそれをリッスンさせ、sessionStoreを作成してグローバルに利用できるようにし、secretKeyでロックし、socketIOの認証方法に設定することです. 次にソケットが行うことは、ユーザーとハンドシェイクを行い、それを高速セッションにリンクすることです。これは、socketIO ID が常に切り替わる一方で、express sessionID がセッション全体で同じままであることを意味します。

于 2012-11-25T10:42:58.410 に答える