非阻塞python套接字

b_m*_*b_m 7 python sockets pys60

我想在PyS60中为我的诺基亚手机写一个小型蓝牙服务器应用程序.它需要能够发送对客户端请求的响应,并能够将数据推送到客户端.

选项1:如果我使用socket.recv(1024),程序会等到收到某些内容,因此服务器无法将数据推送到客户端.用于S60实现的Python缺少该socket.settimeout()方法,因此我无法编写正确的非阻塞代码.

oprion 2:socket.makefile()方法看起来不错,但无法使其发挥作用.当我更换为conn.recv(1024)to时fd = socket.makefile() fd.readline(),它没有读到任何东西.

选项3:查看select()函数,但没有运气.当我改变了conn.recv()r,w,e = select.select([conn],[],[])像它已经建议客户甚至不连接.它挂在"等待客户......".奇怪...

我知道有很好的服务器实现和异步API-s,但我只需要一个非常基本的东西.提前致谢!

这就是我所拥有的:

sock = btsocket.socket(btsocket.AF_BT, btsocket.SOCK_STREAM)
channel = btsocket.bt_rfcomm_get_available_server_channel(sock)
sock.bind(("", channel))                                     
sock.listen(1)
btsocket.bt_advertise_service(u"name", sock, True, btsocket.RFCOMM)

print "Waiting for the client..."                                     
conn, client_mac = sock.accept()
print "connected: " + client_mac

while True:
    try:
        data = conn.recv(1024)
        if len(data) != 0:
           print "received [%s]" % data
           if data.startswith("something"): conn.send("something\r\n")
        else:
           conn.send("some other data \r\n")
    except:
           pass
Run Code Online (Sandbox Code Playgroud)

它显然是阻塞的,所以"其他一些数据"永远不会被发送,但它是迄今为止我所获得的最好的数据.至少我可以发送回复给客户的东西.

b_m*_*b_m 3

终于找到解决办法了!

选择功能不适用于较新的 PyS60 端口的 btsocket 模块。有人编写了一个带有有效选择函数的new_btsocket (可在此处获取)。