所以,我一直有这个问题,无论如何,似乎无法解决它。
使用多线程时,我可以 - 简单地不让这些类相互通信。
是的,我有一些非常难看的代码来支持我的说法。
在这种情况下,我将使用来自小代理的代码作为示例。
此类处理从服务器到被拦截的客户端的数据;
class HandleInbound(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global ftwn
self.dsi.connect(('208.95.184.130',7255))
self.dsi.setblocking(0)
while True:
try:
f = open('odat.tmp','r+')
a = f.read()
if len(a) != 0:
self.dsi.send(open('odat.tmp').read())
open('odat.tmp','w').write("")
dat = self.dsi.recv(65356)
open('idat.tmp','w').write(dat)
udat = dat.encode("hex")
Log(udat, 0, ftwn)
except socket.timeout:
print("DSI Timedout")
except socket.error as e:
Log(e, 2, ftwn)
except Exception as e:
raise
print("In;",e)
self.dsi.close()
sys.exit()
这是我的问题类。记住这一点。
这个按预期工作,处理从客户端到服务器的流量;
class HandleOutbound(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global conn, addr, ftwn
print("Client connected from {}.".format(addr))
conn.setblocking(0)
while True:
try:
f = open('idat.tmp','r+')
a = f.read()
if len(a) != 0:
conn.send(open('idat.tmp').read())
open('idat.tmp','w').write("")
dat = conn.recv(65356)
open('odat.tmp','w').write(dat)
udat = dat.encode("hex")
Log(udat, 0, ftwn)
except socket.timeout:
print("Conn Timedout")
except socket.error as e:
Log(e, 2, ftwn)
except Exception as e:
print("Out;",e)
conn.close()
sys.exit()
如您所见,当前的通信形式是通过临时文件。
HandleOutbound,或者由于时间和空间不足,Class 2读取文件。如果文件中没有数据,它会尝试获取一些数据并将其放在HandleInbound中,或者将第1类读取。
Class 2完成了它的工作,而Class 1在发送讨价还价的数据部分时变得懒惰,后来甚至没有注意到文件和代码在那里,但是,它确实有时间写2GB日志文件"非阻塞错误"在5分钟内到我的电脑,我需要弄清楚是什么以及为什么。
我以前,并且总是首先尝试不同程度的成功全局变量。今天它没有那个。
我还尝试直接从1级到2级进行沟通,甚至使用布尔,但我的运气技巧已经用完了。
我多次重写了Class 1。首先看看是否隐藏了某些东西。没变。然后以相同或尽可能接近的方式匹配到第2类。我最终还要对事物进行C / P并重命名变量。
至少我有一致的结果 - 没有变化!
似乎很少或根本没有初学者或中级指南或文件可以解决这个问题,因为我一直在寻找一段时间,因为在多年的时间里我一直在考虑这个问题"只是google it"。
日志和控制台除了&#34之外没有任何帮助;非阻塞套接字操作无法立即完成"。
我知道代码很糟糕,风格很草率,而且支离破碎,但理论上它应该无论如何都能正常工作,或者不断地使用不同级别,正确吗?