我正在使用 Python 模块 telnetlib 创建一个 telnet 会话(使用国际象棋服务器),但我遇到了一个我实在无法解决的问题。下面的代码可以完美运行:
>>> f = login("my_server") #code for login(host) below.
>>> f.read_very_eager()
这会输出服务器通常在登录时打印的所有内容。但是,当我将它放入函数中然后这样调用它时:
>>> def foo():
... f = login("my_server")
... return f.read_very_eager()
...
>>> foo()
我什么也没得到(空字符串)。我可以检查登录是否正确执行,但由于某种原因我看不到文本。那么它会被吞到哪里呢?
非常感谢。
为了完整起见,这里是登录(主机):
def login(host, handle="guest", password=""):
try:
f = telnetlib.Telnet(host) #connect to host
except:
raise Error("Could not connect to host")
f.read_until("login: ")
try:
f.write(handle + "\n\r")
except:
raise Error("Could not write username to host")
if handle == "guest":
f.read_until(":\n\r")
else:
f.read_until("password: ")
try:
f.write(password + "\n\r")
except:
raise Error("Could not write password to host")
return f
当您手动尝试但在函数中却不起作用的原因是,当您手动尝试时,服务器有足够的时间对登录做出反应并将数据发回。当所有功能都集中在一个功能中时,您可以将密码发送到服务器,并且无需等待服务器回复足够长的时间。
如果您更喜欢(可能更正确)技术答案:
在文件 telnetlib.py (我的 Windows 计算机上的 c:\python26\Lib\telnetlib.py)中,函数read_very_eager(self)
calls self.sock_avail()
现在,函数sock_avail(self)
执行以下操作:
def sock_avail(self):
"""Test whether data is available on the socket."""
return select.select([self], [], [], 0) == ([self], [], [])
它的作用非常简单:如果有任何东西可以从我们的套接字读取(服务器已应答),它将返回 True,否则它将返回 False。
所以呢read_very_eager(self)
所做的是:检查是否有任何内容可供阅读。如果有,则从套接字读取,否则仅返回空字符串。
如果你看一下代码read_some(self)
您会发现它不会检查是否有任何数据可供读取。它会尝试读取,直到有可用的内容为止,这意味着如果服务器在回答您之前花费了 100 毫秒,那么它会在返回答案之前等待 100 毫秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)