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库方法与应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

    浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

    这篇文章主要介绍了浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 代码分析Python地图坐标转换

    代码分析Python地图坐标转换

    这篇文章主要介绍了Python地图坐标转换的相关知识点以及分享了相关的代码实例,对此有兴趣的朋友学习下。
    2018-02-02
  • 这样写python注释让代码更加的优雅

    这样写python注释让代码更加的优雅

    任何编程语言都少不了注释,Python当然也不例外,下面这篇文章主要给大家介绍了关于如何写python注释,才能让你的代码更加的优雅,需要的朋友可以参考下
    2021-06-06
  • Python format补0的实现方法

    Python format补0的实现方法

    对于一些数字的处理,我们可能需要让它们满足一定格式的要求,本文主要介绍了Python format补0的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python 调用 Outlook 发送邮件过程解析

    Python 调用 Outlook 发送邮件过程解析

    这篇文章主要介绍了Python 调用 Outlook 发送邮件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 基于Python实现PDF区域文本提取工具

    基于Python实现PDF区域文本提取工具

    这篇文章主要为大家介绍了如何通过Python实现一个非常精简的图像化的PDF区域选择提取工具,文中示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2021-12-12
  • 使用Python编写Prometheus监控的方法

    使用Python编写Prometheus监控的方法

    今天小编就为大家分享一篇关于使用Python编写Prometheus监控的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • python 字符串常用函数详解

    python 字符串常用函数详解

    这篇文章主要介绍了python 字符串常用函数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • pytorch模型的保存和加载、checkpoint操作

    pytorch模型的保存和加载、checkpoint操作

    这篇文章主要介绍了pytorch模型的保存和加载、checkpoint操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python流程控制语句详解

    Python流程控制语句详解

    所有编程语言在编写时都要遵守语音结构和流程控制,他们控制了整个程序的运行步骤。流程控制包括顺序控制、条件控制和循环控制
    2022-07-07

最新评论