gpt4 book ai didi

python - 非阻塞 python 套接字

转载 作者:太空狗 更新时间:2023-10-29 21:55:40 26 4
gpt4 key购买 nike

我想在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com