Python Socket库基础方法与应用详解

 更新时间:2025年04月08日 08:42:55   作者:老胖闲聊  
这篇文章主要介绍了关于Python socket库的详细技术解析,包含基础方法说明、工作原理剖析,以及多个应用领域的完整实现代码,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

一、Socket基础方法详解

Python的socket模块提供了BSD Socket API接口,以下是核心方法:

1. 构造函数

socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0)
  • 参数:
    • family: 地址族(常用AF_INET表示IPv4)
    • type: 套接字类型(SOCK_STREAM为TCP,SOCK_DGRAM为UDP)
    • proto: 协议号(通常为0,自动选择)

2. 服务器端方法

  • bind(address): 绑定IP地址和端口号(元组格式(host, port)
  • listen(backlog): 启动TCP监听,backlog指定最大排队连接数
  • accept(): 阻塞等待客户端连接,返回(conn, address)元组

3. 客户端方法

  • connect(address): 主动连接服务器

4. 数据传输

  • send(bytes): 发送TCP数据(可能未发送全部数据)
  • sendall(bytes): 发送全部TCP数据(推荐使用)
  • recv(bufsize): 接收TCP数据(最大 bufsize字节)
  • sendto(bytes, address): 发送UDP数据
  • recvfrom(bufsize): 接收UDP数据,返回(data, address)

5. 通用方法

  • close(): 关闭套接字
  • setsockopt(level, optname, value): 设置套接字选项(如SO_REUSEADDR

二、工作原理与实现机制

1. TCP通信流程

2. UDP通信特点

  • 无连接协议
  • 数据包可能丢失或乱序
  • 适合实时性要求高的场景

3. 三次握手(TCP)

  • SYN →
  • ← SYN-ACK
  • ACK →

三、应用领域与实现代码

应用1:基础HTTP服务器(TCP)

import socket

def start_web_server(host='', port=8080):
    with socket.socket() as s:
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind((host, port))
        s.listen(5)
        print(f"Server running on {port}")

        while True:
            conn, addr = s.accept()
            with conn:
                request = conn.recv(1024).decode()
                # 解析HTTP请求头
                headers = request.split('\n')
                filename = headers[0].split()[1][1:] or 'index.html'

                try:
                    with open(filename, 'rb') as f:
                        content = f.read()
                    response = b'HTTP/1.1 200 OK\n\n' + content
                except FileNotFoundError:
                    response = b'HTTP/1.1 404 Not Found\n\n<h1>404 Error</h1>'

                conn.sendall(response)

# 使用示例
start_web_server()

应用2:多线程聊天室(TCP)

import socket
import threading

clients = []

def handle_client(client):
    while True:
        try:
            msg = client.recv(1024)
            if not msg:
                break
            for c in clients:
                if c != client:
                    c.sendall(msg)
        except:
            break
    clients.remove(client)
    client.close()

def start_chat_server(port=9000):
    with socket.socket() as s:
        s.bind(('', port))
        s.listen()
        print(f"Chat server started on {port}")

        while True:
            client, addr = s.accept()
            clients.append(client)
            thread = threading.Thread(target=handle_client, args=(client,))
            thread.start()

# 客户端实现需配合使用连接和发送/接收线程

应用3:文件传输(TCP)

import socket
import hashlib

def send_file(filename, host='127.0.0.1', port=6000):
    with socket.socket() as s:
        s.connect((host, port))
        with open(filename, 'rb') as f:
            file_data = f.read()
            # 计算文件哈希值
            file_hash = hashlib.md5(file_data).hexdigest().encode()
            # 先发送哈希值
            s.sendall(file_hash)
            # 发送文件数据
            s.sendall(file_data)
        print("File sent successfully")

def receive_file(port=6000):
    with socket.socket() as s:
        s.bind(('', port))
        s.listen()
        conn, addr = s.accept()
        with conn:
            # 接收哈希值
            file_hash = conn.recv(32)
            file_data = b''
            while True:
                data = conn.recv(4096)
                if not data:
                    break
                file_data += data
            # 验证完整性
            if hashlib.md5(file_data).hexdigest().encode() == file_hash:
                with open('received_file', 'wb') as f:
                    f.write(file_data)
                print("File received successfully")
            else:
                print("File corrupted")

应用4:端口扫描工具(TCP SYN)

import socket
from concurrent.futures import ThreadPoolExecutor

def scan_port(host, port):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.settimeout(1)
        try:
            s.connect((host, port))
            print(f"Port {port} is open")
            return True
        except:
            return False

def port_scanner(host='127.0.0.1', start=1, end=1024):
    print(f"Scanning {host}...")
    with ThreadPoolExecutor(max_workers=100) as executor:
        results = executor.map(lambda p: scan_port(host, p), range(start, end+1))
    return sum(results)

# 使用示例
port_scanner(end=100)

四、关键技术要点

  1. 地址重用:使用SO_REUSEADDR选项避免端口占用问题
  2. 粘包处理:TCP是流式协议,需自定义消息边界(如长度前缀)
  3. 并发模型
    • 多线程:适合简单并发场景
    • select:适合I/O多路复用
    • asyncio:适合高并发异步处理
  4. 异常处理:必须处理ConnectionResetError等网络异常
  5. 数据编码:网络传输使用bytes类型,需注意编解码

以上代码示例展示了socket编程在不同场景下的典型应用,实际开发中需要根据具体需求添加错误处理、日志记录和安全机制。

到此这篇关于Python Socket库基础方法与应用详解的文章就介绍到这了,更多相关Python Socket库方法与应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 通过Python实现在Word中添加和删除书签的操作

    通过Python实现在Word中添加和删除书签的操作

    在Word中,书签功能是一个非常实用的工具,它允许用户快速定位到文档中的特定位置,无论是进行文档审阅、编辑还是查找特定信息,书签都能提供极大的便利,下面将详细介绍如何通过Python在Word文档中添加和删除书签,需要的朋友可以参考下
    2024-09-09
  • tensorflow查看ckpt各节点名称实例

    tensorflow查看ckpt各节点名称实例

    今天小编就为大家分享一篇tensorflow查看ckpt各节点名称实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 使用Python实现在PDF中添加空白页面的方法

    使用Python实现在PDF中添加空白页面的方法

    在日常办公和数据处理中,PDF文件因其格式稳定性被广泛使用,本文将介绍Python如何使用Spire.PDF for Python实现为PDF添加空白页面,感兴趣的小伙伴可以了解下
    2025-11-11
  • Django框架静态文件使用/中间件/禁用ip功能实例详解

    Django框架静态文件使用/中间件/禁用ip功能实例详解

    这篇文章主要介绍了Django框架静态文件使用/中间件/禁用ip功能,结合实例形式详细分析了Django框架静态文件的使用、中间件的原理、操作方法以及禁用ip功能相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • python中from import的使用解读

    python中from import的使用解读

    本文总结了Python中from和import的使用方法,包括导入模块和导入模块中的对象,强调了模块和对象的概念,并给出了具体的使用示例,最后,建议根据代码维护性和团队编码风格来选择合适的导入方式
    2025-03-03
  • python基本数据类型练习题

    python基本数据类型练习题

    这篇文章主要介绍了python基本数据类型,Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。下面举例说明改内容,,需要的朋友可以参考一下
    2022-01-01
  • Python中pandas模块DataFrame创建方法示例

    Python中pandas模块DataFrame创建方法示例

    这篇文章主要介绍了Python中pandas模块DataFrame创建方法,结合实例形式分析了DataFrame的功能,以及pandas模块基于列表、字段与数组创建DataFrame的相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • python中的sys模块和os模块

    python中的sys模块和os模块

    这篇文章主要介绍了python中的sys模块和os模块,sys模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数,os模块提供了多数操作系统的功能接口函数,下文更多相关内容需要的小伙伴可以参考一下
    2022-03-03
  • Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

    Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现

    这篇文章主要介绍了Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 如何用python批量发送工资条邮件

    如何用python批量发送工资条邮件

    大家好,本篇文章主要讲的是如何用python批量发送工资条邮件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论