2012-05-03 170 views
1

我有一個關於異步套接字的問題。過去幾個月來一直困擾着我,我認爲我應該明智地從這裏的專業人士處獲得事實。異步套接字vs同步

我有一個客戶端的傳入流,我想要在數據中。這個傳入流在開始發送數據之前需要通過字符串進行初始設置。

我聽說過類似node.js的異步tcp服務器的強大可擴展性。我的問題是,我是否可以使用node.js或任何其他異步tcp服務器與此客戶端握手並接收傳入流。

您可以將傳入數據視爲特定時間點的庫存數據或用電量流。實質上數據將不斷流入。

請讓我知道我需要分享哪些其他信息,以幫助我理解異步套接字以及如何使用它。

+0

如果數據將連續流式傳輸,也許最好使用UDP? –

+0

http://www.kegel.com/c10k.html –

+0

這是不可能的,因爲客戶端不使用udp – Poliquin

回答

3

是的,在異步套接字之上實現握手是非常正常的。

考慮僞代碼:

socket = accept() # or connect() 
// now socket is connected 
socket.write(logon_request) 
logon_response = socket.read() 
assert(logon_response ok) 
// now socket is logged in 
socket.write(more_handshake); 
handshake_response = socket.read() 
assert(handshake_response ok) 
// now socket is ready to go 

while data = socket.read() 
{ process data ... } 

您可以模擬這是一個狀態機,它是那麼容易異步插座使用。請參閱下面的代碼是如何很是類似上面,而是分爲多個回調:

# state Idle -> LoggingOn 
handle_connection_event(socket) 
    state = LoggingOn 
    socket.write(logon_request) 

# state LoggingOn -> Handshaking 
handle_login_response(socket) 
    logon_response = socket.read() 
    assert(logon_response ok) 
    state = Handshaking 
    socket.write(more_handshake); 

# state Handshaking -> Ready 
handle_handshake_response(socket) 
    handshake_response = socket.read() 
    assert(handshake_response ok) 
    state = Ready 

和所有讀取根據狀態機來這裏,並得到派出

handle_read(socket) 
    switch(state) { 
    case LoggingOn: handle_logon_response(socket) 
    case Handshaking: handle_handshake_response(socket) 
    case Ready: process(socket.read()) 
    } 

PS 。我出於某種原因在這裏出現了主要格式化失敗,希望它可讀

+0

謝謝!讓我想想今年的解決方案。 – Poliquin

+0

快速的問題,這可以處理多個併發套接字嗎? – Poliquin

+0

是的,只要你喜歡:這通常用於'select','poll'或其他同步事件調度器。只需將一個單獨的狀態機(和/或回調)與每個套接字相關聯即可。 – Useless