gpt4 book ai didi

python - 关于在 python 中运行接收套接字时使用 jython 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:26 25 4
gpt4 key购买 nike

我对python和网络编程了解不多。目前我正在尝试实现一个简单的应用程序,它可以接收用户发送的短信,从谷歌搜索 api 获取一些信息,并通过短信将结果返回给用户。此应用程序将继续收听用户消息并立即回复。

如何获取用户发送的文字短信?这是来自中国移动供应商的名为飞信的程序。客户端飞信,就像一个即时通讯工具,可以向/从其他使用手机接收/发送短信的人发送/接收消息。

我用的是一个开源的python程序,模拟飞信程序。所以基本上我可以使用这个 python 程序通过短信与其他使用手机的人交流。

我的核心程序是基于java的,所以我需要把这个python程序放到java环境中。我正在使用 jython,现在我可以通过几行 java 代码向用户发送消息。

但真正的问题是通过短信接收用户信息的过程。在python代码中,创建了一个新的线程来不断地监听用户。在 Python 中应该没问题,但是当我在 Jython 中运行类似的过程时,出现以下异常:

Exception in thread Thread:Traceback (most recent call last):
File "D:\jython2.5.1\Lib\threading.py", line 178, in _Thread__bootstrap
self.run()
File "<iostream>", line 1389, in run
File "<iostream>", line 1207, in receive
File "<iostream>", line 1207, in receive
File "<iostream>", line 150, in recv
File "D:\jython2.5.1\Lib\select.py", line 223, in native_select
pobj.register(fd, POLLIN)
File "D:\jython2.5.1\Lib\select.py", line 104, in register
raise _map_exception(jlx)
error: (20000, 'socket must be in non-blocking mode')

python代码中第150行如下:

def recv(self,timeout=False):
if self.login_type == "HTTP":
time.sleep(10)
return self.get_offline_msg()
pass
else:
if timeout:
infd,outfd,errfd = select([self.__sock,],[],[],timeout)//<---line 150 here
else:
infd,outfd,errfd = select([self.__sock,],[],[])

if len(infd) != 0:
ret = self.__tcp_recv()

num = len(ret)
d_print(('num',),locals())
if num == 0:
return ret
if num == 1:
return ret[0]
for r in ret:
self.queue.put(r)
d_print(('r',),locals())

if not self.queue.empty():
return self.queue.get()

else:
return "TimeOut"

由于我对python不是很熟悉,尤其是socket部分,而且对Jython的使用也是新手,所以非常需要你的帮助,或者只是建议或解释。

非常感谢!

最佳答案

如 jython 选择文档页面所述,只有处于非阻塞模式的套接字才能在 jython 上多路复用,这与 cpython 不同,后者的套接字可以是阻塞的也可以是非阻塞的。

http://wiki.python.org/jython/SelectModule#Onlysocketsinnon-blockingmodecanbemultiplexed

这是Java的局限性,jython无法改变。

jython select 模块中有一个针对这种情况的特殊函数,即 cpython_compatible_select 函数。

您没有在上面的代码中显示 select 模块的导入,但根据我所看到的,您必须像这样进行导入

从选择导入选择

如果你用这个替换那个导入

从选择导入 cpython_compatible_select 作为选择

然后一切都应该正常工作。

最后,请务必阅读选择模块文档页面上的“警告”部分。

关于python - 关于在 python 中运行接收套接字时使用 jython 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2532943/

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