2012-05-03 41 views
1

私は非同期ソケットに関する質問があります。ここ数ヶ月間私を悩ませていて、私が賢明にすべきだと思って、ここでプロからの事実を得るべきだと思った。非同期ソケットと同期

データを受け取るクライアントからの着信ストリームがあります。この入力ストリームは、データの送信を開始する前に、文字列による初期設定が必要です。

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 ... } 

あなたはその後、非同期ソケットを使用して簡単であるステート・マシン、としてこれをモデル化することができます。以下のコードは、上記のようにanalagousであるかを参照してください、しかし、複数のコールバックに分かれ:

# 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