2012-05-03 168 views
1

我有一个关于异步套接字的问题。过去几个月来一直困扰着我,我认为我应该明智地从这里的专业人士处获得事实。异步套接字vs同步

我有一个客户端的传入流,我想要在数据中。这个传入流在开始发送数据之前需要通过字符串进行初始设置。

我听说过类似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 ... } 

您可以模拟这是一个状态机,它是那么容易异步插座使用。请参阅下面的代码是如何很是类似上面,而是分为多个回调:

# 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