使用Socket创建服务器后用urllib访问遭拒:WinError10061错误排查
问题解答:Socket服务器与urllib客户端连接失败(WinError 10061)
核心原因有两个:
1. 服务器绑定地址与客户端连接地址不匹配
你的Socket服务器绑定的是10.34.9.130,这意味着它只会监听这个特定IP的8080端口。而客户端用http://localhost:8080发起连接,localhost对应的是本地回环地址127.0.0.1,和服务器绑定的IP完全不同,所以服务器会直接拒绝来自127.0.0.1的连接请求,触发WinError 10061。
解决方式二选一:
- 修改服务器的
HOST为"0.0.0.0"(监听所有可用网络接口)或者"127.0.0.1"(仅监听本地回环); - 修改客户端的连接地址为
http://10.34.9.130:8080(确保客户端和服务器在同一网络)。
2. 协议不兼容
你的服务器是基于原始TCP Socket实现的,只会发送一段简单的字节数据,但客户端使用的urllib.request.urlopen是HTTP客户端,它会向服务器发送标准的HTTP请求报文(比如GET / HTTP/1.1)。你的原始Socket服务器完全不懂HTTP协议,即使解决了地址问题,客户端也会因为得不到合法的HTTP响应而报错。
解决方式二选一:
- 保持原始Socket服务器,客户端改用Socket连接(而非urllib);
- 将服务器改成HTTP服务器,适配urllib的HTTP请求。
修改示例代码
方案1:修正地址的原始Socket服务端+Socket客户端
服务端代码:
import socket HOST = "127.0.0.1" # 改为本地回环地址 PORT = 8080 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print(f"Connected by {addr}") data = "this mf got connected".encode() conn.sendall(data) print(data)
客户端代码:
import socket HOST = "127.0.0.1" PORT = 8080 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) data = s.recv(1024) print(data.decode())
方案2:HTTP服务器+原urllib客户端
HTTP服务端代码:
from http.server import BaseHTTPRequestHandler, HTTPServer HOST = "127.0.0.1" PORT = 8080 class MyHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(b"this mf got connected") if __name__ == "__main__": server = HTTPServer((HOST, PORT), MyHandler) print(f"Server running on http://{HOST}:{PORT}") try: server.serve_forever() except KeyboardInterrupt: server.server_close() print("Server stopped.")
此时原urllib客户端代码无需修改即可正常运行。
内容的提问来源于stack exchange,提问作者Mayank Kumar Gupta
相关产品推荐
相关产品推荐

