2016-03-27 45 views
1

我正嘗試使用Node.js和Socket.io構建命令行聊天室。未在服務器上觸發Socket.io連接事件

這是我的服務器端代碼,到目前爲止,我已經與兩個HTTP initialisations嘗試這(在官方網站上的教程與快遞一樣,沒有它):

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


io.sockets.on 'connect', (socket) -> 
    console.log 'a user connected' 


http.listen 3000,() -> 
    console.log 'listening on *:3000' 

我開始這與nodejs server.js ,「聆聽」正在顯現。

如果我運行lsof -i tcp:3000,則顯示server.js進程。

然而,當我開始這個客戶端代碼:

socket = require('socket.io-client')('localhost:3000', {}) 

socket.on 'connect', (socket) -> 
    console.log "Connected" 

沒有運氣...當我運行的NodeJS client.js,既不是「連接」事件,從服務器的客戶端也被解僱了!

我的問題是: - 我在做什麼錯? - 是否需要啓動HTTP服務器才能使用它?套接字位於傳輸層上,對嗎?所以理論上我不需要HTTP協議來交換消息。

+0

這是Coffeescript ... – Matheus208

回答

0

如果這是一個服務器到服務器的連接,並且你只是建立一個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了。

+0

@ Matheus208 - 這是否回答您的問題?如果是這樣,請檢查答案左側的綠色複選標記,以向社區表明您的問題現在已經得到解答,併爲遵循正確的程序贏得一些聲望點。如果這沒有回答你的問題,那麼請評論它仍然缺少的東西,這樣可以編輯答案來完成它。 – jfriend00

相關問題