python - 非阻塞 python 套接字

标签 python sockets pys60

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

相关文章:

python - 获取图片OpenCV Python上分离对象的所有白色像素的坐标数组

python - 实现一种让我的 tron 角色无法通过自身的方法

python - 在多个数组中查找元素数

python `IN` 模块问题 (FreeBSD)

php - PHP套接字编程问题

python - 从 Google Map Mobile 3.0 的 MyLocation 功能中检索纬度/经度

c++ - PyS60 与塞类 C++

python - Django REST 框架 : Generics or ModelViewSets?

node.js - Firefox 插件中的 Socket.io

python - Symbian 的堆栈限制是否也适用于 PyS60?