Python XML-RPC服务端客户端连接失败(WinError 10061)求助
解决XML-RPC服务端连接拒绝及代码错误问题
核心问题:服务端启动失败导致连接拒绝
你遇到的ConnectionRefusedError是因为服务端代码存在变量名错误,根本无法成功启动服务,客户端自然无法连接。以下是具体问题和修正方案:
Server.py 错误修正
原代码存在多处变量名不匹配、异常处理不完善等问题,修正后的代码如下:
import sys import time from xmlrpc.server import SimpleXMLRPCServer # 处理启动参数,添加默认值 host_address = sys.argv[1] if len(sys.argv) > 1 else 'localhost' host_port = int(sys.argv[2]) if len(sys.argv) > 2 else 8000 # 修正变量名错误,正确初始化服务端 server = SimpleXMLRPCServer((host_address, host_port), allow_none=True) def add(x, y): return x + y def sub(x, y): return x - y def mult(x, y): return x * y def div(x, y): try: return x / y except ZeroDivisionError: # 除零异常返回明确提示,让客户端能收到有效反馈 return f"Error: {x} divided by {y} is infinity (division by zero)" def name(): return host_address def help(): # 返回所有可用方法及说明,优化help功能 methods = server.system_listMethods() help_text = "Available methods:\n" for method in methods: help_text += f"- {method}: {server.system_methodHelp(method)}\n" return help_text def servertime(): return time.strftime("%H:%M:%S") # 注册所有方法,明确映射名称 server.register_function(add, 'add') server.register_function(sub, 'sub') server.register_function(mult, 'mult') server.register_function(div, 'div') server.register_function(name, 'name') server.register_function(help, 'help') server.register_function(servertime, 'servertime') print(f"Server running on {host_address}:{host_port}...") server.serve_forever()
关键修正点:
- 变量名统一:原代码中
host_address误写为hostAddress、host_port误写为port,导致启动时抛出NameError,服务直接崩溃。 - 除零异常处理:原代码仅在服务端打印信息,客户端会收到
None,修正为返回明确错误提示。 - 默认参数支持:直接运行
python Server.py即可绑定localhost:8000,也可通过参数指定地址端口。 - help函数优化:返回所有方法的说明,更符合实际需求。
Client.py 错误修正
原代码存在参数类型错误、多余导入等问题,修正后的代码如下:
import xmlrpc.client import sys # 处理连接及计算参数,添加默认值 host_address = sys.argv[1] if len(sys.argv) > 1 else 'localhost' host_port = sys.argv[2] if len(sys.argv) > 2 else '8000' x = float(sys.argv[3]) if len(sys.argv) > 3 else 8.0 y = float(sys.argv[4]) if len(sys.argv) > 4 else 6.0 URI = f"http://{host_address}:{host_port}" proxy = xmlrpc.client.ServerProxy(URI) # 调用服务端方法,参数已转为数值类型 print(f"{x} + {y} is {proxy.add(x, y)}") print(f"{x} - {y} is {proxy.sub(x, y)}") print(f"{x} * {y} is {proxy.mult(x, y)}") print(f"{x} / {y} is {proxy.div(x, y)}") print(f"Server address: {proxy.name()}") print(f"\n{proxy.help()}") print(f"Server time: {proxy.servertime()}")
关键修正点:
- 移除多余导入:客户端不需要
SimpleXMLRPCServer,删除该无用导入。 - 参数类型转换:原代码中
x和y是字符串,直接传入会导致字符串拼接(如"8"+"6"="86"),修正为转为float类型。 - 默认参数支持:直接运行
python Client.py即可使用默认的x=8、y=6连接localhost:8000,也可通过参数自定义。
运行步骤
- 启动服务端:
或指定地址端口:python Server.pypython Server.py localhost 8000 - 启动客户端(另一个终端):
或自定义参数:python Client.pypython Client.py localhost 8000 8 6
内容的提问来源于stack exchange,提问作者Shane Beacham
相关产品推荐
相关产品推荐

