2016-02-13 131 views
0

我有以下代碼:用於Socket.IO解釋的Node.js服務器?

express = require('express'); 
app = express(); 
http = require('http').createServer(app); 
io = require('socket.io')(http); 

app.use(express.static(__dirname + '/')); 
http.listen(80); 

我知道它會創建一個客戶端可以連接到服務器和它的作品。但我不知道到底發生了什麼。你能詳細解釋一下嗎?

另外,爲什麼事情時,我忘記了Express.js,只需使用這條線不工作:

io = require('socket.io').listen(80); 

這似乎監聽連接。但是,在瀏覽器裏面,當我去http://localhost/,沒有任何反應。我的猜測是,我沒有指定我的應用程序的目錄是這樣的:

app.use(express.static(__dirname + '/')); 

這就是爲什麼我需要Express?指定目錄?

在客戶端,我用:

socket = io('http://localhost/'); // this 
socket = io(); // or this 

他們沒有與服務器端的單行代碼工作。

另外,爲什麼當Socket.IO使用WebSocket協議時需要HTTP服務器?

回答

4

當您的瀏覽器轉到http://localhost/時,您需要一個Web服務器,該服務器將通過網頁響應瀏覽器。這就是Express和express.static()線路所做的。當你刪除這些,你確實有一個服務器監聽特定路徑上的webSocket連接,但是你沒有任何服務網頁的東西。所以,當瀏覽器進入http://localhost/時,沒有任何迴應與普通的網頁。

另外,爲什麼當Socket.IO使用WebSocket 協議時需要HTTP服務器?

所有socket.io連接都以HTTP請求開始。 socket.io基於webSocket協議,所有webSocket連接都是通過HTTP請求啓動的。因此,要接受socket.io連接,您需要一個響應HTTP請求的Web服務器,然後您需要一個足夠智能的Web服務器來識別對webSocket連接的請求,以便它可以從HTTP到webSocket。

有關如何建立webSocket連接的詳細概述,請參閱this overview on MDN

socket.io基礎架構在連接後會在該webSocket上運行。

我知道它創建了一個服務器,客戶端可以連接到它並工作。 但我不知道到底發生了什麼。你能詳細解釋一下嗎?

這是你的代碼的行由行解釋:

express = require('express'); 

這將加載快速庫。

app = express(); 

這將創建可被用作網絡服務器的請求處理程序一Express app對象。

http = require('http').createServer(app); 

這將創建一個Web服務器並通過它快速app對象作爲Web服務器請求處理。

io = require('socket.io')(http); 

此掛鉤socket.io到Web服務器作爲另一個請求處理程序,因此可以看到,實際上是開始的WebSocket/socket.io連接的第一個階段,任何進入的HTTP請求。

app.use(express.static(__dirname + '/')); 

這就告訴快遞,如果任何請求的網頁,它應該在__dirname對所請求的路徑相匹配的文件進行。如果找到,它應該返回該路徑。

http.listen(80); 

這將啓動Web服務器偵聽端口80

他們沒有與服務器端的單行代碼工作。

正確使用時,創建socket.io連接的這兩行代碼都能正常工作。你不會說這個代碼是如何運行的。如果您嘗試從瀏覽器從http://localhost/加載的網頁運行此代碼,那麼我已經解釋了爲什麼該網頁在您未啓動Express時無法加載。如果您試圖從某個網頁加載某些其他方式的代碼行,那麼您可能會遇到同源安全問題,默認情況下,瀏覽器不會讓您訪問不同於一個網頁來自。

+0

如果有人想知道,__dirname是目錄服務器腳本正在運行。 –

2

您需要使用express http服務器將套接字客戶端傳送到瀏覽器。

  • Express服務器的80端口

  • 瀏覽器連接到表達對80端口啓動時,socket.io服務器組件提供套接字客戶端的JavaScript的瀏覽器(http://localhost:80/socket.io/socket.io.js

  • 客戶端的Socket(在瀏覽器中運行)可以連接到socket.io服務器

相關問題