Python套接字编程:连接到服务器时应用程序冻结
我不熟悉Python中的套接字编码,我编写了这个简单的函数来连接到服务器。它在tkinter窗口中运行。我有一个Python套接字编程:连接到服务器时应用程序冻结,python,sockets,windows-8,network-programming,Python,Sockets,Windows 8,Network Programming,我不熟悉Python中的套接字编码,我编写了这个简单的函数来连接到服务器。它在tkinter窗口中运行。我有一个条目小部件,您可以在其中输入要连接的服务器的IP地址。但是,当您单击按钮进行连接时,应用程序将挂起并冻结。下面是代码 def Test(self): socket.setdefaulttimeout(5) lengthInfo = self.lengthEntry.get() if self.portEntry.get() != '': port
条目
小部件,您可以在其中输入要连接的服务器的IP地址。但是,当您单击按钮进行连接时,应用程序将挂起并冻结。下面是代码
def Test(self):
socket.setdefaulttimeout(5)
lengthInfo = self.lengthEntry.get()
if self.portEntry.get() != '':
portInfo = int(self.portEntry.get())
serverInfo = self.serverEntry.get()
conn = socket.socket()
if not self.portEntry.get():
portInfo = 80
try:
conn = socket.socket()
name = socket.gethostbyname(serverInfo)
conn.connect((name,portInfo))
ans = conn.recv(2048)
self.outputWindow.insert(END, "Connection successful: \n \
port:{}, server:{} ('{}'), '{}' \n".format(portInfo, name, serverInfo, \
ans))
return
except Exception as e:
self.outputWindow.insert(END, str(e) + "\n")
我最初认为这是因为现在有超时,但正如您所看到的,我在代码的第一行添加了5秒超时。我认为这是因为应用程序在连接时遇到了一些问题,但我检查了Windows任务管理器,在网络部分下没有任何活动。我也在Ubuntu 14.04中运行了这个程序,但得到了相同的结果。
有解决方案吗?套接字等待来自服务器的2048个字节(
conn.recv(2048)
),我猜它们永远不会到达。通过阅读文档,可以预期socket.setdefaulttimeout(5)
会使recv()
在这种情况下在5秒后失败。我尝试将字节数调低,首先是1024,然后是512,然后返回到128,但得到的结果是相同的。recv()将在有字节给您时立即返回;它不会等到完全达到您指定的字节数。(但返回的字节数不会超过指定的字节数)是否确实正在调用recv()?您可能在connect()调用中被阻止(甚至可能在gethostbyname()调用中被阻止)。