我对异步套接字有疑问。在过去的几个月里一直困扰着我,并且认为我应该明智地从专业人士那里得到事实。
我有来自客户端的传入流,我想要接收数据。此传入流需要在开始发送数据之前通过字符串进行初始设置。
我听说过node.js等异步tcp服务器的强大可扩展性。我的问题是我是否可以使用node.js或任何其他异步tcp服务器与此客户端握手并接收传入流。
您可以将输入数据视为特定时间点的库存数据流或用电量。实质上,数据将连续流式传输。
请告诉我需要分享的其他信息,以帮助我了解异步套接字以及如何使用它。
答案 0 :(得分: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。由于某些原因,我在这里遇到了重大的格式化失败,希望它是可读的