Python 3 网络编程详解:从原理到实战

前言

在数字化时代,网络编程已成为软件开发领域不可或缺的一部分。Python 3 凭借其简洁的语法、丰富的标准库和强大的第三方库,成为网络编程的热门选择之一。无论是开发简单的客户端-服务器应用,还是构建复杂的分布式系统,Python 3 都能提供高效且可靠的解决方案。

本文将全面系统地介绍 Python 3 网络编程的核心概念、关键技术、实战案例以及高级技巧,帮助读者从入门到精通,掌握网络编程的精髓。


第一部分:网络编程基础概念

1.1 网络协议概述

网络协议是网络中设备之间进行通信的规则和约定,常见的协议包括 TCP(传输控制协议)和 UDP(用户数据报协议)。

TCP(传输控制协议)

  • 面向连接、可靠的传输协议
  • 通过三次握手建立连接
  • 保证数据的有序传输和完整性
  • 适用于对数据准确性要求高的场景,如文件传输、网页浏览等

UDP(用户数据报协议)

  • 无连接、不可靠的传输协议
  • 数据传输速度快
  • 不保证数据一定能到达目的地,也不保证数据的顺序
  • 常用于实时性要求高但允许少量数据丢失的场景,如视频流、音频流传输等

1.2 TCP与UDP的核心区别

特性 TCP UDP
连接类型 面向连接 无连接
可靠性 保证交付(重传丢失的数据包) 无交付保证
顺序保持 保持数据包顺序 无顺序保证
使用场景 文件传输、HTTP、电子邮件 视频流、游戏、DNS

1.3 端口号

端口是计算机与外界通信交流的出口,用于区分不同的网络服务和应用程序。端口号的范围是 0-65535:

  • 0-1023:系统保留端口,用于常见的网络服务(如HTTP默认80端口,HTTPS默认443端口)
  • 1024-65535:自定义程序建议使用的端口范围

1.4 套接字(Socket)

套接字是网络编程的基石,它是一种抽象的通信端点,为应用程序提供了发送和接收数据的接口。通过套接字,应用程序可以与网络中的其他应用程序进行通信,它可以基于不同的协议(如TCP、UDP)创建,也可以在不同的地址族(如IPv4、IPv6)上工作。


第二部分:Python Socket编程基础

2.1 Socket模块概述

Python 3 的 socket 模块提供了对套接字编程的支持,使用该模块可以直接创建基于 TCP 和 UDP 协议的网络应用。该模块是 Python 标准库的一部分,无需额外安装即可使用。

2.2 核心API详解

创建Socket对象
复制代码
import socket

# family: 地址簇,AF_INET表示IPv4,AF_INET6表示IPv6
# type: 传输类型,SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
服务端常用方法
  • bind((host, port)):绑定IP地址和端口号
  • listen(backlog):开始监听连接,backlog为最大等待连接数
  • accept():阻塞等待客户端连接,返回(新套接字对象,客户端地址)
  • recv(bufsize):接收数据,bufsize为每次接收的最大字节数
  • send(data):发送字节类型数据
  • close():关闭套接字
客户端常用方法
  • connect((host, port)):向服务端发起连接请求
  • send(data):发送字节数据
  • recv(bufsize):接收数据
  • close():关闭套接字

2.3 TCP通信的工作流程

TCP通信遵循特定的流程:

服务端:创建套接字 → 绑定端口 → 开启监听 → 接受连接 → 接收数据 → 发送响应 → 关闭连接

客户端:创建套接字 → 连接服务端 → 发送数据 → 接收响应 → 关闭连接

TCP通信过程中,客户端先发起连接,经过三次握手建立连接,然后双方收发数据,最后通过四次挥手断开连接。

2.4 UDP通信的工作流程

UDP通信无需建立连接:

服务端:创建套接字 → 绑定端口 → 直接接收客户端数据报 → 发送响应

客户端:创建套接字 → 直接向目标IP+端口发送数据报 → 接收响应


第三部分:TCP协议实战开发

3.1 TCP服务器实现

TCP服务器需要按照特定的流程来创建。下面是一个完整的TCP服务器示例:

复制代码
import socket

def tcp_server():
    # 1. 创建一个TCP服务器Socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2. 绑定服务器地址和端口
    # 0.0.0.0 表示监听本机所有网卡的IP
    server_address = ('0.0.0.0', 12345)
    server_socket.bind(server_address)
    print(f"服务器已绑定端口 {server_address[1]}")
    
    # 3. 开始监听连接,最大等待连接数为5
    server_socket.listen(5)
    print("服务器正在监听客户端连接...")
    
    try:
        while True:
            # 4. 阻塞等待客户端连接
            client_socket, client_address = server_socket.accept()
            print(f"收到来自 {client_address} 的连接")
            
            try:
                # 5. 接收客户端消息(最多1024字节)
                message = client_socket.recv(1024)
                if message:
                    print(f"收到客户端消息: {message.decode('utf-8')}")
                    
                    # 6. 向客户端发送响应
                    response = 'Hello, Client!'
                    client_socket.send(response.encode('utf-8'))
            finally:
                # 7. 关闭连接
                client_socket.close()
    finally:
        server_socket.close()

3.2 TCP客户端实现

TCP客户端的实现相对简单,主要包含连接、发送和接收三个步骤:

复制代码
import socket

def tcp_client():
    # 1. 创建TCP客户端Socket
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # 2. 连接到服务器
    client_socket.connect(('127.0.0.1', 12345))
    
    # 3. 发送消息(需要编码为字节流)
    message = "Hello from TCP Client!"
    client_socket.send(message.encode('utf-8'))
    print(f"Sent: {message}")
    
    # 4. 接收服务器响应
    response = client_socket.recv(1024).decode('utf-8')
    print(f"Received: {response}")
    
    # 5. 关闭连接
    client_socket.close()

3.3 TCP通信的关键特性

TCP通信的核心优势在于其可靠性和有序性:

  • 可靠传输:TCP保证数据能够到达目的地,如果数据包丢失,会自动重传
  • 有序传输:TCP保持数据包的顺序,接收方会按照发送顺序重组数据
  • 面向连接:通信前需要建立连接,通信结束后需要断开连接
  • 字节流服务:TCP将数据视为连续的字节流,没有消息边界

这些特性使TCP非常适合文件传输、HTTP通信、电子邮件等对数据准确性要求高的应用场景。

3.4 TCP通信的最佳实践

在实际开发中,需要注意以下几点:

  1. 数据编码:网络传输必须是字节数据,发送前需要将字符串编码为字节流,接收后需要解码为字符串
  2. 缓冲区大小recv(bufsize)指定每次接收的最大字节数,应根据实际需求合理设置
  3. 关闭资源:使用完毕后一定要关闭套接字,释放系统资源
  4. 异常处理:网络通信可能出现各种异常,需要做好错误处理

第四部分:UDP协议实战开发

4.1 UDP服务器实现

UDP服务器无需建立连接,可以直接接收和发送数据:

复制代码
import socket

def run_udp_server(host='localhost', port=65433):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as server_sock:
        server_sock.bind((host, port))
        print(f"UDP Server listening on {host}:{port}")
        
        while True:
            data, client_addr = server_sock.recvfrom(1024)
            message = data.decode('utf-8')
            print(f"Received from {client_addr}: {message}")
            
            # 发送响应
            server_sock.sendto(f"ECHO: {message}".encode('utf-8'), client_addr)

4.2 UDP客户端实现

UDP客户端可以直接向目标地址发送数据,无需预先建立连接:

复制代码
import socket

def run_udp_client(host='localhost', port=65433):
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as client_sock:
        message = "Hello from UDP Client!"
        client_sock.sendto(message.encode('utf-8'), (host, port))
        print(f"Sent: {message}")
        
        # 接收服务器响应
        data, server_addr = client_sock.recvfrom(1024)
        response = data.decode('utf-8')
        print(f"Received: {response}")

4.3 UDP通信的关键特性

UDP通信的特点使其在某些场景下具有明显优势:

  • 无连接:通信前无需建立连接,减少延迟
  • 速度快:由于不需要确认和重传,数据传输速度更快
  • 数据报服务:保持消息的边界,每个数据报都是一个完整的消息
  • 不可靠:不保证数据一定能到达,也不保证数据的顺序

这些特性使UDP非常适合视频直播、在线游戏、实时数据传输等对实时性要求高的场景。


第五部分:高级网络编程技术

5.1 多线程网络编程

在实际应用中,单线程服务器可能无法满足处理大量并发连接的需求。这时可以使用多线程技术:

复制代码
import socket
import threading

def handle_client(client_socket, client_address):
    """处理单个客户端连接的函数"""
    try:
        while True:
            data = client_socket.recv(1024)
            if data:
                message = data.decode('utf-8')
                print(f'收到客户端 {client_address} 消息: {message}')
                response = f'你发送的消息是: {message}'
                client_socket.send(response.encode('utf-8'))
            else:
                break
    finally:
        client_socket.close()
        print(f'客户端 {client_address} 已断开连接')

# 创建多线程TCP服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
server_socket.bind(server_address)
server_socket.listen(5)

print('多线程服务器已启动,等待客户端连接...')

while True:
    client_socket, client_address = server_socket.accept()
    print(f'客户端 {client_address} 已连接')
    client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
    client_thread.start()

多线程服务器的优势在于:

  • 每个客户端连接由独立的线程处理
  • 不会因为某个客户端的操作阻塞其他客户端的服务
  • 提高了服务器的并发处理能力

5.2 多进程网络编程

多进程编程与多线程类似,但使用 multiprocessing 模块创建和管理进程:

复制代码
from multiprocessing import Process
import socket

def handle_client_process(client_socket, client_address):
    """进程处理函数"""
    try:
        data = client_socket.recv(1024)
        if data:
            message = data.decode('utf-8')
            print(f'进程处理: 收到来自 {client_address} 的消息: {message}')
            client_socket.send(f'进程处理: {message}'.encode('utf-8'))
    finally:
        client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8889))
server_socket.listen(5)

print('多进程服务器已启动...')

while True:
    client_socket, client_address = server_socket.accept()
    p = Process(target=handle_client_process, args=(client_socket, client_address))
    p.start()
    client_socket.close()  # 父进程关闭该连接

多进程编程的特点:

  • 每个进程有独立的内存空间
  • 适合CPU密集型任务
  • 进程间通信相对复杂

5.3 异步网络编程

Python 3.4 引入了 asyncio 库,用于实现异步 I/O 操作,极大地提高了网络应用的性能和并发处理能力:

复制代码
import asyncio

async def handle_client(reader, writer):
    """异步处理客户端连接"""
    data = await reader.read(1024)
    message = data.decode('utf-8')
    addr = writer.get_extra_info('peername')
    
    print(f"收到来自 {addr} 的消息: {message}")
    
    # 发送响应
    response = f"服务器收到: {message}"
    writer.write(response.encode('utf-8'))
    await writer.drain()
    
    print("关闭连接")
    writer.close()

async def main():
    """启动异步服务器"""
    server = await asyncio.start_server(
        handle_client, '127.0.0.1', 8888
    )
    
    addr = server.sockets[0].getsockname()
    print(f'服务器运行在 {addr}')
    
    async with server:
        await server.serve_forever()

# 运行异步服务器
asyncio.run(main())

异步编程的优势:

  • 单线程处理多个并发连接
  • 资源占用少,性能高
  • 避免了线程/进程切换的开销
  • 适合I/O密集型任务

5.4 使用socketserver模块

Python的 socketserver 模块提供了更高级的服务器框架,简化了网络编程:

复制代码
import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    """TCP请求处理器"""
    def handle(self):
        # 接收数据
        self.data = self.request.recv(1024).strip()
        print(f'[{self.client_address[0]}] {self.data.decode()}')
        
        # 发送数据
        self.request.sendall('Hello, Client!'.encode())

if __name__ == "__main__":
    HOST, PORT = "localhost", 8080
    
    # 创建服务器
    with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
        print('服务器启动,等待连接...')
        # 启动服务器
        server.serve_forever()

socketserver 模块的优点:

  • 简化了服务器的创建流程
  • 支持多线程(ThreadingTCPServer)和多进程(ForkingTCPServer
  • 使用面向对象的方式处理请求

第六部分:HTTP协议与Web编程

6.1 构建简单的HTTP服务器

Python内置的 http.server 模块可以快速搭建HTTP服务器:

复制代码
from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    """自定义HTTP请求处理器"""
    def do_GET(self):
        # 发送响应状态码
        self.send_response(200)
        
        # 发送响应头
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        
        # 发送响应体
        self.wfile.write(b"<h1>Hello, World!</h1>")

if __name__ == '__main__':
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
    print('服务器运行在 http://localhost:8000')
    httpd.serve_forever()

6.2 使用urllib发送HTTP请求

Python官方提供的 urllib 库可以处理HTTP操作:

复制代码
from urllib import request, parse

# 发送GET请求
response = request.urlopen('https://api.example.com/data')
print(response.read().decode('utf-8'))

# 发送POST请求
data = parse.urlencode({'key': 'value'}).encode()
req = request.Request('https://api.example.com/submit', data=data)
response = request.urlopen(req)
print(response.read().decode('utf-8'))

6.3 使用requests库(第三方)

虽然 urllib 功能完整,但 requests 库提供了更简洁的API:

复制代码
import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')
print(response.json())

# 发送POST请求
response = requests.post('https://api.example.com/submit', json={'key': 'value'})
print(response.status_code)

第七部分:实战项目:构建聊天服务器

7.1 项目需求分析

构建一个支持多客户端的聊天服务器,实现以下功能:

  • 多客户端同时连接
  • 消息广播(所有客户端都能收到消息)
  • 客户端加入/离开通知

7.2 聊天服务器实现

复制代码
import socket
import threading

# 存储所有连接的客户端
clients = []
client_lock = threading.Lock()

def broadcast(message, sender_socket=None):
    """向所有客户端广播消息"""
    with client_lock:
        for client in clients:
            if client != sender_socket:
                try:
                    client.send(message)
                except:
                    client.close()
                    clients.remove(client)

def handle_client(client_socket, client_address):
    """处理单个客户端"""
    print(f'新客户端连接: {client_address}')
    
    # 通知其他客户端有新用户加入
    join_message = f'[系统] 用户 {client_address} 加入了聊天室'
    broadcast(join_message.encode('utf-8'), client_socket)
    
    try:
        while True:
            # 接收客户端消息
            data = client_socket.recv(1024)
            if not data:
                break
            
            message = f'[{client_address[0]}]: {data.decode()}'
            print(f'收到消息: {message}')
            
            # 广播给所有其他客户端
            broadcast(message.encode('utf-8'), client_socket)
    except:
        pass
    finally:
        # 客户端断开连接
        with client_lock:
            if client_socket in clients:
                clients.remove(client_socket)
        
        leave_message = f'[系统] 用户 {client_address} 离开了聊天室'
        broadcast(leave_message.encode('utf-8'))
        client_socket.close()
        print(f'客户端 {client_address} 已断开连接')

def start_chat_server(host='localhost', port=9999):
    """启动聊天服务器"""
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f'聊天服务器启动,监听 {host}:{port}')
    
    try:
        while True:
            client_socket, client_address = server_socket.accept()
            
            with client_lock:
                clients.append(client_socket)
            
            # 为每个客户端创建新线程
            client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
            client_thread.start()
    finally:
        server_socket.close()

if __name__ == '__main__':
    start_chat_server()

7.3 聊天客户端实现

复制代码
import socket
import threading

def receive_messages(client_socket):
    """接收消息的线程函数"""
    while True:
        try:
            data = client_socket.recv(1024)
            if not data:
                break
            print(data.decode('utf-8'))
        except:
            break

def start_chat_client(host='localhost', port=9999):
    """启动聊天客户端"""
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((host, port))
    
    # 启动接收消息的线程
    receive_thread = threading.Thread(target=receive_messages, args=(client_socket,))
    receive_thread.daemon = True
    receive_thread.start()
    
    print('已连接到聊天室,输入消息发送(输入exit退出)')
    
    try:
        while True:
            message = input()
            if message.lower() == 'exit':
                break
            client_socket.send(message.encode('utf-8'))
    finally:
        client_socket.close()

if __name__ == '__main__':
    start_chat_client()

第八部分:网络安全与最佳实践

8.1 使用SSL/TLS加密通信

在需要安全通信的场景下,可以使用SSL/TLS对Socket进行加密:

复制代码
import socket
import ssl

# 创建SSL上下文
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')

# 创建安全的Socket服务器
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8443))
server_socket.listen(5)

while True:
    client_socket, addr = server_socket.accept()
    secure_socket = context.wrap_socket(client_socket, server_side=True)
    # 处理安全的连接...

8.2 异常处理与资源管理

在网络编程中,必须要做好异常处理和资源管理:

复制代码
import socket

def safe_socket_operation():
    """安全的Socket操作示例"""
    sock = None
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(10)  # 设置超时时间
        sock.connect(('example.com', 80))
        sock.send(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
        response = sock.recv(4096)
        return response
    except socket.timeout:
        print("连接超时")
    except socket.gaierror:
        print("地址解析错误")
    except ConnectionRefusedError:
        print("连接被拒绝")
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        if sock:
            sock.close()

8.3 套接字选项优化

通过设置套接字选项可以优化网络程序性能:

复制代码
import socket

# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 允许地址重用,避免"地址已在使用"错误
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 设置发送和接收缓冲区大小
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 65536)

# 设置TCP No Delay(禁用Nagle算法,减少延迟)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

# 设置超时时间
sock.settimeout(30.0)

8.4 最佳实践总结

  1. 始终关闭Socket :使用 with 语句或 try-finally 块确保资源释放
  2. 合理设置超时:避免程序无限期阻塞
  3. 编码一致性:确保发送方和接收方使用相同的编码方式
  4. 错误处理:捕获并处理所有可能的异常
  5. 数据校验:对接收的数据进行合法性校验
  6. 并发控制:在多线程环境中使用锁保护共享资源
  7. 缓冲区管理:合理设置缓冲区大小,避免内存溢出

第九部分:高级主题与扩展

9.1 原始套接字编程

原始套接字允许直接访问底层网络协议:

复制代码
import socket

# 创建原始套接字(需要管理员权限)
raw_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

# 设置IP头包含选项
raw_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# 接收原始数据包
packet = raw_socket.recvfrom(65565)

9.2 组播编程

组播(Multicast)允许将数据发送到多个接收者:

复制代码
import socket
import struct

# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 绑定到组播地址和端口
multicast_group = '224.0.0.1'
port = 5000
sock.bind(('', port))

# 加入组播组
group = socket.inet_aton(multicast_group)
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

# 接收组播数据
data, address = sock.recvfrom(1024)

9.3 网络爬虫实战

结合 requestsBeautifulSoup 可以构建网络爬虫:

复制代码
import requests
from bs4 import BeautifulSoup

# 发送HTTP请求
url = 'https://www.example.com'
response = requests.get(url)

# 解析HTML
soup = BeautifulSoup(response.text, 'html.parser')

# 提取标题
title = soup.find('h1').text
print(f'网页标题: {title}')

# 提取链接
links = soup.find_all('a')
for link in links:
    href = link.get('href')
    text = link.text
    print(f'链接: {text} -> {href}')

9.4 使用Netmiko进行网络自动化

对于网络设备自动化管理,可以使用Netmiko库:

复制代码
from netmiko import ConnectHandler

# 定义设备参数
device = {
    'device_type': 'cisco_ios',
    'ip': '192.168.1.1',
    'username': 'admin',
    'password': 'password',
}

# 连接设备
connection = ConnectHandler(**device)

# 发送命令
output = connection.send_command('show ip interface brief')
print(output)

# 关闭连接
connection.disconnect()

第十部分:总结与展望

10.1 核心要点回顾

Python 3 网络编程的核心要点包括:

  1. Socket基础:理解TCP和UDP的区别,掌握Socket API的使用
  2. 并发处理:掌握多线程、多进程和异步编程技术
  3. 协议实现:能够实现TCP/UDP服务器和客户端
  4. 高级特性:了解SSL/TLS加密、组播编程等高级技术
  5. 实战应用:能够构建聊天服务器、HTTP服务器等实际应用

10.2 学习路径建议

  1. 入门阶段:掌握Socket基础API,实现简单的回声服务器
  2. 进阶阶段:学习多线程/异步服务器,理解并发编程模式
  3. 高级阶段:研究网络协议细节,学习网络安全知识
  4. 实战阶段:参与开源项目,构建分布式系统

10.3 未来发展方向

Python网络编程的未来发展方向包括:

  • 异步编程:asyncio等异步框架的广泛应用
  • 微服务架构:使用Python构建微服务
  • 云原生应用:与Kubernetes等容器编排平台集成
  • 物联网通信:MQTT等轻量级协议的应用
相关推荐
geovindu2 小时前
java: Singleton Pattern
java·开发语言·后端·单例模式·设计模式·创建型模式
满怀冰雪2 小时前
24_中间件系统源码分析_Middleware链的洋葱模型与异常处理
人工智能·python·中间件·langchain
江华森2 小时前
03-python-包与模块异常处理
python
犹豫的哑铃2 小时前
WebSocket 协议
网络·websocket·网络协议
AI行业学习2 小时前
2026 版 Notepad++ 完整图文安装指南|官方渠道无捆绑,一键切换中文界面
开发语言·人工智能·python·html·notepad++
炘东5923 小时前
求助:在另一个 Reasonix 窗口或后台运行
python
apcipot_rain3 小时前
计科八股2026705——正态分布、独立与不相关、范数、列表元组集合、链表队列、sort函数、URL执行
python·计算机网络·概率论
鹏易灵3 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
水无痕simon3 小时前
5 多表操作
java·开发语言·数据库