はい、非同期ソケットの上にハンドシェイクを実装することは完全に正常です。
疑似コードを考えてみましょう:
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。なんらかの理由でここで重大なフォーマットエラーが発生しています。読みやすいことを願っています