搜尋

首頁  >  問答  >  主體

node.js - socket.IO 【 require('socket.io').listen(80);】不解!找遍所有群也未解决,求高手解答!

官网上有一个这样的示例(http://socket.io/docs/):

此处,说明是会创建一个http请求,但是我没明白,这个请求创建了之后,要怎么访问呢,我看代码engine.io.js里,有这样一段代码:

     function listen(port, options, fn) {
    if (‘function’ == typeof options) {
    fn = options;
    options = {};
    }

    var server = http.createServer(function (req, res) {
        res.writeHead(501);
        res.end('Not Implemented');
    });

    server.listen(port, fn);

    // create engine server
    var engine = exports.attach(server, options);
    engine.httpServer = server;

    return engine;
    };

创建的一个501请求,但是这样创建的一个,用什么方法可以访问呢??
还有就是如果才能触发 connection事件呢??

一直没搞明白这两个问题

按我的理解是,创建了一个HTTP服务,然后通过浏览器去访问,然后再通过客户端的 var socket = io(‘http://localhost’);来建立长链接,然后触发后端的才能触发connection事件。

但是,最上面的代码,不清楚在哪个地方可以触发事件,并且怎么访问建立的HTTP服务!请知道的解答一下,谢谢

PHPzPHPz2778 天前554

全部回覆(1)我來回復

  • ringa_lee

    ringa_lee2017-04-17 11:35:41

    按我的理解是,創建了一個HTTP服務,然後通過瀏覽器去訪問,然後再通過客戶端的var socket = io('http://localhost');來建立長鏈接,然後觸發後端的才能觸發connection事件。

    這個理解是錯的。題主應該是認為 /chat 這個 URL 可以直接透過瀏覽器存取吧,這是不對的,這個 URL 只是 socket.io 的一個 channel,並非真實 URL。

    Socket.io 的例子漏掉了很重要的一段,即下面這些程式碼,它的作用是返回一個 html 頁面,頁面的內容即是 client 的 index.html。

    javascript// 这段代码直接来自 socket.io 的第一个例子:Using with Node http server
    
    var app = require('http').createServer(handler)
    var io = require('socket.io')(app);
    var fs = require('fs');
    
    app.listen(80);
    
    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);
      });
    }
    

    寫了這段程式碼之後才能實現完整的 socket.io 用戶端/服務端流程:

    1. 客戶端存取服務端 /,得到 index.html;
    2. 客戶端 index.html 裡呼叫 io.connect('http://localhost/chat') 建立連線;
    3. 服務端收到 /chat channel 的 connection 事件,執行 chat.on('connection') 的程式碼。

    var io = require('socket.io').listen(80); 這段程式碼就是個坑人的存在,對初學者來說就是個*。實際上使用 socket.io 的時候不會這麼寫,一般是以那三個 Using with... 的用法之一來提供服務。

    回覆
    0
  • 取消回覆