You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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()  # 记得关闭连接,避免资源占用

正确运行流程

  1. 先运行server.py,确认服务端已经启动并处于监听状态
  2. 再运行client.py(其他机器上运行客户端的话,要把connect里的IP换成服务端的实际局域网IP)

当时的错误提示截图:
Socket连接被拒绝错误提示

内容的提问来源于stack exchange,提问作者user11363434

火山引擎 最新活动