异步套接字与同步

时间:2012-05-03 14:02:49

标签: sockets

我对异步套接字有疑问。在过去的几个月里一直困扰着我,并且认为我应该明智地从专业人士那里得到事实。

我有来自客户端的传入流,我想要接收数据。此传入流需要在开始发送数据之前通过字符串进行初始设置。

我听说过node.js等异步tcp服务器的强大可扩展性。我的问题是我是否可以使用node.js或任何其他异步tcp服务器与此客户端握手并接收传入流。

您可以将输入数据视为特定时间点的库存数据流或用电量。实质上,数据将连续流式传输。

请告诉我需要分享的其他信息,以帮助我了解异步套接字以及如何使用它。

1 个答案:

答案 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。由于某些原因,我在这里遇到了重大的格式化失败,希望它是可读的