我想在 PyS60 中为我的诺基亚手机编写一个小型蓝牙服务器应用程序。它需要能够发送对客户端请求的响应,并能够向客户端推送数据。
选项 1:
如果我使用 socket.recv(1024)
,程序会一直等到收到某些东西,因此服务器无法将数据推送到客户端。 S60 的 Python 实现缺少 socket.settimeout()
方法,所以我无法编写正确的非阻塞代码。
oprion 2:
socket.makefile()
方法看起来不错,但无法实现。当我将 conn.recv(1024)
替换为 fd = socket.makefile() fd.readline()
时,它什么也没读。
选项 3:
查看了 select()
函数,但没有成功。当我将 conn.recv()
更改为 r,w,e = select.select([conn],[],[])
就像有人建议的那样客户端甚至不连接。它卡在“等待客户......”。奇怪...
我知道还有非常好的服务器实现和异步 API,但我在这里只需要一些非常基本的东西。提前致谢!
这是我所拥有的:
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
它显然是阻塞的,所以“一些其他数据”永远不会发送,但这是迄今为止我得到的最好的数据。至少我可以回复客户一些东西。
最佳答案
终于找到解决办法了!
选择功能不适用于较新的 PyS60 端口的 btsocket 模块。 有人写了一个 new_btsocket(可用 here ),带有一个有效的选择功能。
关于python - 非阻塞 python 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8404704/