Python socket的accept()方法无法中断导致程序无法退出

在学习Python网络编程时,遇到一个问题:使用socket的accept方法监听TCP请求时,程序在阻塞模式下无法通过Ctrl-C正常退出。原因是Python 3.5及以上版本中,socket.accept在被中断时会重试系统调用,而不是抛出异常。为了解决这个问题,可以将socket放入守护线程执行,主线程捕获到信号后退出,从而实现程序的正常退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学到了Python的网络编程,练习socket的使用,用它编写一个简单的服务监听程序。

用套接字监听TCP请求的程序

""" 
2020-11-18 16:54:08+0800 chenxizhan new
"""
import os.path
import socket

print('pid:', os.getpid())

def task(host, port):

    s = socket.socket()
    print('监听:{}:{}'.format(host, port))
    s.bind((host, port))
    s.listen()
    while True
### Python 中使用 Socket 接收数据 在 Python 中,`socket` 模块提供了低级别的网络接口用于实现客户端和服务器之间的通信。为了接收来自其他计算机或同一台机器上不同进程的信息,通常会按照如下模式设置一个监听端口并接受连接。 #### 创建服务端以接收消息 下面是一个简单的例子展示怎样建立 TCP 服务器来等待客户机的连接,并读取传入的消息: ```python import socket def start_server(host='127.0.0.1', port=65432): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket: # 绑定地址到套接字 server_socket.bind((host, port)) # 开始监听连接请求 server_socket.listen() print(f"Listening on {host}:{port}") while True: conn, addr = server_socket.accept() # 阻塞直到有新的连接进来 with conn: print('Connected by', addr) while True: data = conn.recv(1024) # 尝试从已连接的客户端那里获取最多1KB的数据 if not data: break # 如果没有更多的数据,则退出循环 message = data.decode().strip() print(f"Received from client: {message}") start_server() ``` 此脚本定义了一个 `start_server()` 函数,在指定主机名 (`host`) 和端口号 (`port`) 上启动一个TCP/IP服务器[^1]。当一个新的连接被接受时,它进入内部循环尝试不断接收数据直至遇到空包为止。每次成功接收到有效负载后都会将其解码成字符串形式打印出来。 对于异常情况下的处理也非常重要,比如网络中断或者对方主动断开连接等情况都应该考虑到。上述代码通过 `with` 语句自动管理资源关闭,确保即使发生错误也能正常释放占用的端口和其他系统资源[^2]。 另外需要注意的是实际应用中可能还需要考虑并发性能优化等问题,这里仅提供最基础的功能演示[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值