如果這是一個服務器到服務器的連接,並且你只是建立一個socket.io連接(而不是爲常規的HTTP連接設置它),那麼這段代碼只顯示了一個socket.io連接的簡單方法:
聽socket.io只服務器
// Load the library and initialize a server on port 3000
// This will create an underlying HTTP server, start it and bind socket.io to it
const io = require('socket.io')(3000);
// listen for incoming client connections and log connect and disconnect events
io.on('connection', function (socket) {
console.log("socket.io connect: ", socket.id);
socket.on('disconnect', function() {
console.log("socket.io disconnect: ", socket.id);
});
});
Node.js的socket.io客戶端 - 連接到另一臺服務器socket.io
// load the client-side library
const io = require('socket.io-client');
// connect to a server and port
const socket = io('http://localhost:3000');
// listen for successful connection to the server
socket.on('connect', function() {
console.log("socket.io connection: ", socket.id);
});
此代碼適用於我的電腦。我可以在同一臺主機上運行兩個獨立的node.js應用程序,他們可以相互交談,都可以看到連接和斷開事件。
一些解釋
的socket.io協議通過使HTTP連接到HTTP服務器發起。所以,只要你有一個socket.io連接,就有一個HTTP服務器在某個地方監聽。該HTTP連接最初是通過一些特殊的頭文件發送的,這些頭文件向服務器表明這是一個「升級」到webSocket協議的請求,並且包含一些額外的安全信息。
這是關於如何初始建立webSocket連接的pretty great reference。它會一步一步告訴你發生了什麼。
一旦雙方就協議中的「升級」達成一致,則協議切換到webSocket(socket.io然後是基本webSocket協議頂部的附加協議層,但連接全部在HTTP/webSocket級別)。一旦升級達成一致,原來是傳入HTTP連接的完全相同的TCP連接將被重新利用,併成爲webSocket/socket.io連接。
使用socket.io服務器端庫,您可以自己創建HTTP服務器,然後將其傳遞給socket.io,或者您可以使用socket.io爲您創建一個。如果你只使用套接字。io在這臺服務器上,而不是同時使用http服務器進行常規的http請求,那麼你可以去任何一種方式。上面的最小代碼示例,讓socket.io透明地爲您創建http服務器,然後socket.io將其綁定到它。如果您也正在從http服務器發出常規Web請求,那麼通常首先會創建http服務器,然後將它傳遞給socket.io,以便socket.io可以綁定到您已擁有的http服務器。
然後,請記住,socket.io正在使用webSocket傳輸。這只是webSocket傳輸之上的一些附加數據包結構。它類似於同意通過HTTP連接發送JSON。 HTTP是主機傳輸和底層數據格式。雙方同意以JSON格式格式化一些數據並通過HTTP發送。以這種方式,socket.io消息格式位於webSocket之上。
您的問題
是否需要開始使用它的HTTP服務器?
是的,一個HTTP服務器必須存在某個地方,因爲所有的socket.io連接開始於一個HTTP服務器的HTTP請求。
套接字位於傳輸層上,對吧?
初始連接協議棧的工作原理是這樣的:
TCP <- HTTP protocol
然後,協議升級後:
TCP <- webSocket <- socket.io
所以從HTTP協議升級到WebSocket的運輸後,你再擁有坐在TCP之上的webSocket格式之上的socket.io數據包格式。
所以理論上我不需要HTTP協議來交換消息。
不,這是不正確的。所有連接最初都是使用HTTP建立的。一旦升級發生在webSocket傳輸中,就不再使用HTTP了。
這是Coffeescript ... – Matheus208