2013-02-28 27 views
1

我有一個最初由HTTP服務的網頁。點擊提交後,它會發送一些數據到服務器,並做很少的Web服務,這將需要很長的時間。我需要快速顯示響應頁面,完成Web服務作業後,必須在先前加載的同一頁面中顯示結果。處理js和套接字io的響應

通過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); 


    }); 
}); 
+0

'glitr-router'和'glitr-router-client'允許來自服務器和連接客戶端的socket.io響應功能,就像你在expressjs中一樣。它還支持REST端點,因此從REST到socket.io的轉換可以無縫連接。 – X0r0N 2017-12-06 10:54:55

回答

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> 
2

是的。有關如何使用它的示例,請看一個socket.io webpage

+0

但在我的情況下,我需要將一個冗長的Web服務的返回結果傳遞給套接字和客戶端瀏覽器。但是在這裏我無法訪問套接字,因爲我已經處理了http處理程序的響應。它沒有與套接字偵聽器的連接。 – 2013-03-01 09:04:39

+0

檢查聊天應用程序以瞭解如何設置WebSocket的詳細信息。您可以通過請求調用服務器。當它準備就緒時,它會回調websocket處理函數。 – gbjbaanb 2013-03-01 12:04:34