Python Socket Error [Errno 61] Connection refused

681 阅读3分钟

在使用 Python 编程时,使用 socket 库进行网络连接时遇到了报错信息:[Errno 61] Connection refused,且尝试多次连接后又遇到了 [Errno 22] Invalid argument 错误。我们希望找出问题的原因并找到解决方案。

huake_00198_.jpg

解决方案

问题一:[Errno 61] Connection refused

1. 检查端口是否被占用

首先,我们需要确认尝试连接的端口号 4444 是否已经被其他服务或应用程序占用。可以使用 netstat 或类似工具检查是否有其他程序正在监听该端口。

2. 确保服务器正在运行

如果端口未被占用,我们需要确保服务器程序正在运行并且正在监听该端口。如果服务器端没有启动,则客户端将无法建立连接,从而导致连接被拒绝。

3. 检查防火墙或安全设置

有时候,防火墙或安全软件可能会阻止网络连接。我们需要检查防火墙或安全软件的设置,确保它们允许应用程序连接到该端口。

问题二:[Errno 22] Invalid argument

1. 使用 socket.gethostname() 而非 gethostname()

在创建套接字对象时,使用 socket.gethostname() 来获取计算机的名称,而不是简单的 gethostname()。这可能会导致无效参数错误。

2. 端口号必须在 0 到 65535 之间

我们要确保尝试连接的端口号在 0 到 65535 之间。超出此范围的端口号可能会导致无效参数错误。

3. 检查 IP 地址

如果使用 IP 地址来建立连接,请检查 IP 地址是否正确无误。如果 IP 地址不正确,则无法建立连接。

以下是一些代码示例,演示了如何解决上述问题:

import socket

# 检查端口 4444 是否被占用
http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;
if socket.gethostbyname('localhost') == '127.0.0.1':
    # 端口 4444 未被占用
else:
    # 端口 4444 被占用,需要找到占用它的应用程序或服务

# 检查服务器是否正在运行
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    server_socket.bind(('localhost', 4444))
    server_socket.listen(5)
except socket.error:
    # 服务器未启动,需要启动它

# 检查防火墙或安全设置
firewall_settings = ...  # 从防火墙或安全软件中获取设置
if firewall_settings['allow_port_4444']:
    # 防火墙或安全软件允许连接到端口 4444
else:
    # 防火墙或安全软件阻止了连接到端口 4444,需要调整设置

# 使用 socket.gethostname() 而不是 gethostname()
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((socket.gethostname(), 4444))  # 使用 socket.gethostname()

# 确保端口号在 0 到 65535 之间
PORT_RANGE = (0, 65535)
if port_number in PORT_RANGE:
    # 端口号在有效范围内
else:
    # 端口号无效,需要调整

# 检查 IP 地址是否正确
ip_address = ...  # 从用户输入或其他来源获取 IP 地址
if socket.inet_aton(ip_address):
    # IP 地址有效
else:
    # IP 地址无效,需要调整

通过遵循这些步骤并检查这些可能导致错误的原因,我们可以解决 Python Socket Error [Errno 61] Connection refused 和 [Errno 22] Invalid argument 问题,从而成功建立网络连接。