2013-03-13 28 views
0

我想创建一个python套接字(或套接字服务器),一旦连接到单个设备,维护一个开放的连接,以便进行定期检查,看看是否有数据已经送走了。套接字只会侦听一个连接。维护套接字连接,不规则的数据频率

例如为:

def get_data(conn): 
    response='back atcha' 
    data = conn.recv(1024) 
    print 'get_data:',data 
    if data: 
     conn.send(response) 

s = open_socket() 
conn, addr = s.accept() 
while True: 
    print 'running' 
    time.sleep(1) 
    get_data(conn) 
    #do other stuff 

一旦服务器套接字绑定和连接已被接受,运行插座块时一个.recv直到连接的客户端发送一些数据或关闭其插座。由于我正在等待不规则数据(可能是秒,可能是一天),并且程序需要在此期间执行其他任务,所以这种阻塞是一个问题。

我不希望客户端关闭其套接字,因为它可能需要随时向服务器发送(或接收)数据。是在单独的线程中运行这个唯一的解决方案,还是有一种简单的方法来设置客户端/服务器套接字永久保持连接(并且这是安全的?它将在VLAN上运行),而不会阻塞数据已收到?

回答

1

您正在寻找非阻塞I/O,也称为异步I/O。使用一个单独的线程阻塞这是非常低效的,但它非常简单。

对于Python异步I/O框架,我强烈推荐Twisted。同时检查出标准库附带的asyncore

+1

非阻塞I/O和异步I/O是两件不同的事情。 – EJP 2013-03-13 22:15:42

+0

Look [here](http://stackoverflow.com/questions/16745409/what-does-pythons-socket-recv-return-for-non-blocking-sockets-if-no-data-is-r)例子如何使用非阻塞套接字。 – Armali 2014-06-06 12:14:11