我想写一个小的蓝牙服务器应用程序,使用 PyS60 在我的 Nokia 手机上。它需要能够响应客户端请求并能够向客户端推送数据。
选项1:
如果我使用
我知道有非常好的服务器实现和异步 API,但我只需要真正基本的东西。先感谢您!下面是我的代码:
很明显这是阻塞的,因此“一些其他数据”从未被发送,但这是我目前为止最好的办法。至少我可以回复客户端并发送一些内容。
socket.recv(1024)
,程序会等待接收到消息,因此服务器无法向客户端推送数据。Python for S60 实现缺少socket.settimeout()
方法,所以我无法编写适当的非阻塞代码。
选项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
很明显这是阻塞的,因此“一些其他数据”从未被发送,但这是我目前为止最好的办法。至少我可以回复客户端并发送一些内容。