2015-11-12 126 views
0

我不確定我瞭解套接字的服務器端配置。Socket.io回調函數參數混淆

var app = express(); 
var server = require('http').createServer(app); 
var socketio = require('socket.io')(server, { 
    serveClient: config.env !== 'production', 
    path: '/socket.io-client' 
}); 

這裏,代碼根據api引用創建一個與http服務器「連接」的套接字服務器。什麼是附加?

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 

    socket.address = socket.handshake.address !== null ? 
     socket.handshake.address.address + ':' + socket.handshake.address.port : 
     process.env.DOMAIN; 

    socket.connectedAt = new Date(); 

    // Call onDisconnect. 
    socket.on('disconnect', function() { 
     onDisconnect(socket); 
     console.info('[%s] DISCONNECTED', socket.address); 
    }); 

    // Call onConnect. 
    onConnect(socket); 
    console.info('[%s] CONNECTED', socket.address); 
    }); 
}; 

問題:在這裏,'套接字'變量是服務器還是客戶端?如果它是服務器的話,爲什麼socket.join(房間)工作? (客戶端被添加到一個房間)如果是客戶端,那麼爲什麼它必須聽'創建'事件(客戶端發出一個名爲create的事件來改變房間)。

來結束,我被三個'socket'在下面的代碼中。

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 
}); 

回答

4

這裏,代碼創建一個套接字服務器根據所述API參考「附接」與HTTP服務器。什麼是附加?

WebSocket連接(這socket.io是建立在頂部)都得到首先做一個HTTP連接從客戶端發起的。因此,必須有一個可用於socket.io連接的HTTP服務器。這就是爲什麼socket.io的初始化需要HTTP連接的原因。通常情況下,該Web服務器也充當普通Web服務器,因此可用於這兩個目的。這簡化了跨源問題,因爲所有瀏覽器都將所有客戶端連接到其網頁所服務的同一個來源。如果你還沒有其他的web服務器,socket.io可以創建它自己的。

問題:在這裏,'套接字'變量是服務器還是客戶端?

它是表示到特定客戶端的連接的服務器端對象。 Socket.io在客戶端上有一個套接字對象,表示到服務器的客戶端連接,並且在服務器上有一個套接字對象(用於每個單獨的客戶端連接),用於表示與特定客戶端的連接。

所以,如果你想將數據發送到特定的客戶端,您使用socket對象,表示該客戶端,你做的事:

socket.emit(msg, data); 

如果是服務器那麼爲什麼socket.join(房間)的作品?

這是可行的,因爲socket對象表示與特定客戶端的連接。它是一個服務器端對象,但它是特定於特定客戶端的(例如,每個客戶端連接有不同的對象)。

總結,我在下面的代碼中被三個'套接字'弄糊塗了。

socketio.on('connection', function (socket) { 
    socket.on('create', function(room) { 
     console.log('joining a room'); 
     socket.join(room); 
     console.log('socket joined room: ', room); 
    }); 
}); 

socketio代表整體socket.io模塊是如何執行全局命令。在這種情況下,您正在執行全局命令來偵聽新連接的客戶端。

當您收到connection事件時,該事件的參數是新創建的socket對象(表示與特定客戶端的連接的服務器端對象)。

socket.on('create', ...)是從客戶端發送到服務器的create消息的偵聽器。因此,這行代碼表示要監聽從這個特定的(新連接的)客戶端發送的create消息,並且當該消息到達時,調用回調並將與消息一起發送的數據(本例中爲房間名稱)傳遞給它。

socket.join(room);行使用與上面相同的socket並將其連接到服務器上的特定空間。

+0

非常感謝!你的解釋很棒! –