Python3 网络编程:socket 套接字编程
                           
天天向上
发布: 2025-03-16 12:06:08

原创
566 人浏览过


学习Python3 网络编程,从基础 socket 编程开始,逐步深入解析 Python3 网络编程的所有内容。


1. socket 套接字编程

1.1 socket 基础

Python 提供 socket 模块来进行底层网络编程,支持 TCP(流式协议)UDP(数据报协议)

1.1.1 socket 相关概念

  • IP 地址:用于标识网络中的设备(如 192.168.1.1)。
  • 端口号:用于区分同一设备上的不同应用程序(如 HTTP 端口 80)。
  • 协议
  • TCP(传输控制协议):面向连接,保证数据可靠传输。
  • UDP(用户数据报协议):无连接,速度快,但不保证数据完整性。
  • 服务器与客户端
  • 服务器(Server):监听端口,等待客户端连接。
  • 客户端(Client):向服务器发起连接并传输数据。

1.2 socket TCP 编程

1.2.1 TCP 服务器

一个基本的 TCP 服务器:

import socket

# 创建 TCP 套接字(默认 SOCK_STREAM 为 TCP)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定 IP 和端口
server_socket.bind(("0.0.0.0", 12345))

# 开始监听(最多 5 个客户端等待)
server_socket.listen(5)
print("服务器启动,等待连接...")

while True:
    # 等待客户端连接
    client_socket, addr = server_socket.accept()
    print(f"客户端 {addr} 连接成功")

    # 接收数据(最大 1024 字节)
    data = client_socket.recv(1024)
    print(f"收到数据:{data.decode()}")

    # 发送响应
    client_socket.send(b"Hello from server!")

    # 关闭连接
    client_socket.close()

1.2.2 TCP 客户端

客户端连接服务器并发送数据:

import socket

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

# 连接服务器
client_socket.connect(("127.0.0.1", 12345))

# 发送数据
client_socket.send(b"Hello Server!")

# 接收数据
response = client_socket.recv(1024)
print(f"服务器响应:{response.decode()}")

# 关闭连接
client_socket.close()

1.2.3 TCP 服务器 – 多线程支持

多个客户端并发连接:

import socket
import threading

def handle_client(client_socket, addr):
    print(f"客户端 {addr} 连接成功")
    data = client_socket.recv(1024)
    print(f"收到数据:{data.decode()}")
    client_socket.send(b"Hello from server!")
    client_socket.close()

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("0.0.0.0", 12345))
server_socket.listen(5)
print("服务器启动,等待连接...")

while True:
    client_socket, addr = server_socket.accept()
    thread = threading.Thread(target=handle_client, args=(client_socket, addr))
    thread.start()

1.3 socket UDP 编程

UDP 是无连接的,适用于对速度要求高,但不要求数据可靠性的场景,如视频流或游戏。

1.3.1 UDP 服务器

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(("0.0.0.0", 12345))

print("UDP 服务器启动,等待数据...")

while True:
    data, addr = server_socket.recvfrom(1024)
    print(f"收到来自 {addr} 的数据:{data.decode()}")
    server_socket.sendto(b"Hello from UDP Server!", addr)

1.3.2 UDP 客户端

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 发送数据
client_socket.sendto(b"Hello UDP Server!", ("127.0.0.1", 12345))

# 接收服务器响应
data, server = client_socket.recvfrom(1024)
print(f"服务器响应:{data.decode()}")

client_socket.close()

1.4 套接字选项

使用 setsockopt 设置不同的套接字行为:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 设置 SO_REUSEADDR 允许端口复用,避免“地址已在使用”错误
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 绑定端口
sock.bind(("0.0.0.0", 12345))
sock.listen(5)

下篇文章继续讲解 asyncio 异步网络编程,包括 asyncio TCP 服务器、asyncio WebSocket 服务器等内容!

发表回复 0

Your email address will not be published. Required fields are marked *