1

非同期ソケットについて質問があります。ここ数か月、私は頭を悩ませていて、ここでプロから事実を知るべきだと思いました.

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

node.js のような非同期 tcp サーバーの強力なスケーラビリティについて聞いたことがあります。私の質問は、node.js または他の非同期 tcp サーバーを使用して、このクライアントとハンドシェイクし、着信ストリームを受信できるかどうかです。

受信データは、特定の時点での在庫データまたは電力使用量のストリームと考えることができます。基本的に、データは継続的にストリーミングされます。

非同期ソケットとその使用方法を理解するために共有する必要があるその他の情報を教えてください。

4

1 に答える 1

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。なんらかの理由でここで重大なフォーマットエラーが発生しています。読みやすいことを願っています

于 2012-05-03T14:36:50.433 に答える