Socket连接被主动拒绝问题解决:启动顺序错误及跨机器访问需求
解决Socket错误:目标机器主动拒绝连接(已解决)
作为刚入门Socket编程的新手,我最近踩了个典型的坑——运行代码时遇到了Socket错误:无法建立连接,因为目标机器主动拒绝了连接,不过现在已经完全搞定了,把过程和代码分享给大家。
问题背景
我想写一个简单的Socket程序:服务端发送一段字节消息,让同一网络内的任意机器都能连接并获取这个消息,但第一次运行时直接触发了连接被拒绝的问题。
错误根源
说出来有点尴尬,我犯了新手最容易犯的错误——先启动了客户端client.py,再启动服务端server.py。当客户端尝试发起连接请求时,服务端还没启动监听端口,自然就被主动拒绝了。
我最初的代码
server.py
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = 12048 s.bind((socket.gethostname(), port)) s.listen() while True: c, addr = s.accept() print("Got connection from", addr) c.send(bytes("Thank you", "utf-8"))
client.py
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = 12048 s.connect(('192.168.0.1', port)) msg = s.recv(1024) print(msg.decode("utf-8"))
额外优化:让任意机器都能连接
另外,我发现最初的服务端代码有个小问题:绑定了socket.gethostname(),这会导致只有本地或者能解析到该主机名的设备才能连接。如果要让同一局域网(若需公网访问还需配置端口映射)的任意机器都能访问,需要把绑定地址改成0.0.0.0,这样服务端会监听所有可用的网络接口:
修正后的server.py:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) port = 12048 # 绑定到所有网络接口,允许任意机器连接 s.bind(('0.0.0.0', port)) s.listen() while True: c, addr = s.accept() print("Got connection from", addr) c.send(bytes("Thank you", "utf-8")) c.close() # 记得关闭连接,避免资源占用
正确运行流程
- 先运行
server.py,确认服务端已经启动并处于监听状态 - 再运行
client.py(其他机器上运行客户端的话,要把connect里的IP换成服务端的实际局域网IP)
当时的错误提示截图:
内容的提问来源于stack exchange,提问作者user11363434




