python socket 超时设置 errno 10054

  • Post category:Python

Python Socket 超时设置 errno 10054

概述

在使用Python的Socket进行网络编程时,会经常涉及到超时设置。如果没有正确设置超时,可能会由于网络阻塞等原因导致程序一直等待而无法继续执行,造成程序假死现象。本文将详细讲解如何在Python的Socket编程中正确设置超时。

错误现象

在没有进行超时设置的情况下,如果对方主机在连接时没有启动或者网络通讯出现异常,将会产生许多问题,比如程序卡死等。具体表现为:

Windows平台下的错误码为:errno 10054,即WSAECONNRESET;
Linux平台下的错误码为:errno 32,即EPIPE错误。

修改方法

Python的Socket库提供了settimeout()方法,可以指定连接或数据收发的超时时间,当Socket连接或数据收发操作超出指定的时间范围时,抛出timeout异常。

示例1

代码如下:

import socket

# 创建socket对象
s = socket.socket()

# 设置超时时间
s.settimeout(10)

# 主动连接远程服务器
s.connect(('www.baidu.com', 80))

# 发送请求到服务器
s.sendall(b"GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: close\r\n\r\n")

# 接收服务器响应数据
print(s.recv(1024))

# 关闭socket
s.close()

上述代码中,我们创建了一个socket连接并设置了超时时间为10秒,然后发送HTTP请求到百度服务器,并接收响应数据。执行代码时如果百度服务器正常响应,则可以正常获取服务器返回的响应数据;而如果超时时间内一直没有收到响应数据,则会抛出timeout异常。

示例2

代码如下:

import socket

# 创建socket对象
s = socket.socket()

# 设置超时时间
s.settimeout(10)

# 监听端口
s.bind(('localhost', 9999))
s.listen()

# 等待客户端连接
try:
    while True:
        conn, addr = s.accept()
        print('已连接:', addr)

        # 接收客户端数据
        with conn:
            while True:
                data = conn.recv(1024)
                if not data:
                    break

                print('接收到的数据为:', data.decode())
                # 发送响应数据
                conn.sendall(b'Hello from server!')

except socket.timeout as err:
    print(err)

# 关闭socket
s.close()

上述代码中,我们创建了一个socket服务器并设置了超时时间为10秒,然后等待客户端连接,并接收客户端发送的消息并进行响应。执行代码时如果超时时间内没有连接到客户端,则会抛出timeout异常。

结语

以上就是Python Socket超时设置的攻略,通过调整超时时间,我们可以根据实际业务需求来确保Socket的连接或数据的传输不会因为网络等原因而出现异常,从而保证程序的稳定性。