1

Web ページが最初に HTTP によって提供されるシナリオがあります。送信をクリックすると、一部のデータがサーバーに送信され、長時間かかる Web サービスがいくつか実行されます。応答ページをすばやく表示する必要があり、Web サービス ジョブが完了したら、以前に読み込まれた同じページに結果を表示する必要があります。

これは、http ハンドラーによってすべての要求を処理し、ソケット io によって結果を渡すことによって可能になります。

似たようなコードを書きたいと思っています。

var httpd = require('http').createServer(handler);
var io = require('socket.io').listen(httpd);
var fs = require('fs');
httpd.listen(4000);
function handler(req, res) {
    fs.readFile(__dirname + '/index.html',
        function(err, data) {
            if (err) {
                res.writeHead(500);
                return res.end('Error loading index.html');
            }
            res.writeHead(200);

            res.end(data);
        }
        );

}
io.sockets.on('connection', function (socket) {
    socket.on('clientMessage', function(content) {
       setTimeout(function () {
           socket.emit('serverMessage', "web service complete");
       }, 5000);


    });
});
4

2 に答える 2

2

私は自分の問題の解決策を得たので、これを自分の質問への回答として追加しています。私は socket.io チャット アプリケーションを参照しました。これは便利ですが、完全なドキュメントはありません。一部の関数については、ソース コードを確認する必要があります。セッションを使用して、ソケットと http 要求と各クライアントを識別しました。動作することがわかったコードを貼り付けます。

 var io = require('socket.io');
    var express = require('express');
    var http = require('http');
    var fs = require('fs');
    var connect = require('connect');
    var cookie = require("cookie");
    var app = express();
    var server = http.createServer(app)
    var parseCookie = connect.utils.parseCookie;
    var parseSignedCookie = connect.utils.parseSignedCookie;
    var MemoryStore = connect.session.MemoryStore; 
    var sessionStore = new MemoryStore();


    app.configure(function () {
        app.use(express.bodyParser());
        app.use(express.cookieParser('somesuperspecialsecrethere'));
        app.use(express.session({
            key: 'express.sid',
            store: sessionStore
        }));

    });

    app.get('/', function(req, res){
        fs.readFile(__dirname + '/index.html',
            function(err, data) {
                if (err) {
                    res.writeHead(500);
                    return res.end('Error loading index.html');
                }

                res.writeHead(200);
                res.end(data);
                console.log("SessionID from http: "+req.sessionID);

    setTimeout(function () { //this is for simulating a time taking task
               var sock_id = io.sockets.sockets[req.sessionID];

            io.sockets.sockets[sock_id].emit("getmessage","my mmmmmmmmmmmmmessssssage");

        }, 5000);

            });
    });


    GLOBAL.sio = io.listen(server);
    server.listen(3000);

    sio.sockets.on('connection', function (socket) {

        var hs = socket.handshake;

        socket.on('clientMessage', function(data) {
        console.log("Message from client: "+ data.message);

        io.sockets.sockets[hs.sessionID] = socket.id;
      });

    });

    sio.set('authorization', function (data, accept) {
        if (!data.headers.cookie) {
            return accept('Session cookie required.', false);
        }

        data.cookie = cookie.parse(data.headers.cookie);

        data.cookie = parseSignedCookie(data.cookie['express.sid'], 'somesuperspecialsecrethere');

        data.sessionID = data.cookie;

        console.log('Session Id from socket: ' + data.sessionID);

        sessionStore.get(data.sessionID, function(err, session){
            if (err) {
                return accept('Error in session store.', false);
            } else if (!session) {
                return accept('Session not found.', false);
            }
            // success! we're authenticated with a known session.
            data.session = session;
            return accept(null, true);
        });



        <html>
            <head>
                <title>express WebSocket chat</title>
                <script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
                <script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'></script>

            </head>
            <body>

                <script src="http://10.3.0.52:3000/socket.io/socket.io.js"></script>
                <script type="text/javascript">


                    var sio = io.connect('http://10.3.0.52:3000');

                    sio.socket.on('error', function (reason){
                        console.error('Unable to connect Socket.IO', reason);
                    });

                    sio.on('connect', function (){
                        console.info('successfully established a working connection ');
                    });

 sio.on('getmessage', function(data) {
        console.log(data);

        });
                </script>

                <input type="text" name="message" id="message">
                <input type="button" name="send" id="send" value="Send">
            </body>
        </html>
于 2013-03-15T13:05:43.920 に答える
2

はい。使用方法の例については、1 つのsocket.io Web ページを参照してください。

于 2013-02-28T13:09:43.177 に答える