导入client.py中的变量为何会触发未调用的客户端连接报错?
问题根因
- Python导入任意模块时,都会自动执行该模块顶层全局作用域的所有可执行代码。你
client.py中的socket初始化、连接逻辑都写在全局作用域,没有做入口判断,所以当你在服务端执行from client import text时,Python会直接运行client.py里的连接代码,此时你的服务端大概率还没完成端口监听,自然会触发连接超时的报错。 - 额外需要注意:你试图通过导入模块的方式获取客户端运行时的
text变量本身就行不通。服务端和客户端是两个完全独立的进程,内存空间相互隔离,导入模块拿到的只是client.py文件中定义的初始值,完全拿不到客户端实际运行时产生的变量值。
修复方案
- 首先修改
client.py的代码结构,把运行时才需要执行的逻辑放到if __name__ == "__main__"判断块中,避免被导入时执行:
import socket import sys # 全局变量、工具函数可以放在这里,被导入时不会触发额外执行 text = "" # 你原来定义的text变量 if __name__ == "__main__": client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) IP = '192.168.68.166' PORT = 4444 try: client.connect((IP, PORT)) username = input("Username: ") except socket.error: print("Connection timed out, probably host is down") client.close() sys.exit()
- 废弃通过导入模块获取
text长度的逻辑,改为客户端发送密文时,先把明文长度、密文一起打包发送给服务端,服务端接收到后先解析长度再做解密截断即可。
内容的提问来源于stack exchange,提问作者SQLi
相关产品推荐
相关产品推荐

