目录

一、网络基础

1. TCP 协议

2. UDP 协议

3. Socket 简介

二、TCP编程

1. TCP 客户端示例

2. TCP 服务器示例

三、UDP 编程

1. UDP 客户端示例

2. UDP 服务器示例

四、小案例:简易聊天应用

1. TCP 聊天客户端

2. TCP 聊天服务器


一、网络基础

网络编程是指通过计算机网络进行信息交换与通信的技术,网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。最常见的通信协议是TCP和UDP!。

1. TCP 协议

  • 特点

    • 可靠传输:通过三次握手建立连接,确保数据完整性和顺序。

    • 面向连接:通信前需建立稳定的端到端连接。

    • 流式传输:数据以字节流形式传输,自动处理分包和重组。

    • 适用场景:文件传输、网页访问(HTTP)、邮件(SMTP)等需要高可靠性的场景。

  • 核心机制

    • 三次握手:客户端与服务器确认双方收发能力。

    • 流量控制:通过滑动窗口机制避免接收方缓冲区溢出。

    • 拥塞控制:动态调整发送速率防止网络拥堵。

2. UDP 协议

  • 特点

    • 无连接:无需建立连接,直接发送数据包。

    • 不可靠传输:不保证数据到达顺序或是否丢失。

    • 高效性:头部开销小(仅8字节),传输延迟低。

    • 适用场景:实时音视频、在线游戏、DNS查询等对实时性要求高的场景。

  • 与 TCP 对比

    特性 TCP UDP
    连接方式 面向连接 无连接
    可靠性
    传输效率 低(握手、重传)
    数据边界 字节流(无明确边界) 数据报(保留边界)

3. Socket 简介

  • 定义:Socket 是网络通信的端点,用于不同主机或同一主机的进程间通信。

  • 核心要素

    • 地址族AF_INET(IPv4)、AF_INET6(IPv6)。

    • 协议类型SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)。

  • 通信流程

    • 服务器:创建 Socket → 绑定 IP 和端口 → 监听连接 → 接受连接 → 收发数据。

    • 客户端:创建 Socket → 连接服务器 → 收发数据。

二、TCP编程

在TCP编程中,客户端和服务器之间的通信需要经过连接的建立和断开。

1. TCP 客户端示例

import socket

# 创建 TCP Socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # 连接服务器(IP 和端口需与服务器一致)
    client_socket.connect(("127.0.0.1", 8888))
    
    # 发送数据(需编码为字节流)
    client_socket.send("Hello Server!".encode("utf-8"))
    
    # 接收响应(缓冲区大小设为 1024)
    response = client_socket.recv(1024)
    print("收到服务器响应:", response.decode("utf-8"))

except ConnectionRefusedError:
    print("连接被拒绝,请检查服务器是否启动!")
finally:
    client_socket.close()  # 关闭连接

2. TCP 服务器示例

import socket
import threading

# 创建 TCP Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # 允许端口复用

# 绑定 IP 和端口
server_socket.bind(("0.0.0.0", 8888))  # 0.0.0.0 表示监听所有网络接口
server_socket.listen(5)  # 设置最大等待连接数

print("服务器启动,等待客户端连接...")

def handle_client(client_socket, addr):
    """处理客户端连接"""
    print(f"客户端 {addr} 已连接")
    try:
        while True:
            data = client_socket.recv(1024)  # 接收数据
            if not data:
                break
            print(f"收到来自 {addr} 的消息:", data.decode("utf-8"))
            client_socket.send("消息已收到".encode("utf-8"))  # 发送响应
    except ConnectionResetError:
        print(f"客户端 {addr} 异常断开")
    finally:
        client_socket.close()

# 循环接受客户端连接
while True:
    client_socket, addr = server_socket.accept()  # 阻塞等待连接
    # 为每个客户端创建新线程
    threading.Thread(target=handle_client, args=(client_socket, addr)).start()

三、UDP 编程

最大区别技术在于UDP不需要建立连接,客户端和服务器直接发送和接受数据。

1. UDP 客户端示例

import socket
def udp_client():
#创建 UDP 客户端 socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#发送数据
message = 'Hello, UDP Server'
client_socket.sendto (message.encode ('utf-8'), ('127.0.0.1', 12345)) # 发送数据并指定目标地址
#接收服务器响应
response, server_address = client_socket.recvfrom (1024) # 接收数据和服务器地址
print ('Received from server:', response.decode ('utf-8'))
#关闭 socket
client_socket.close()
if name == 'main':
udp_client()

2. UDP 服务器示例

import socket
def udp_server():
#创建 UDP 服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#绑定服务器地址和端口
server_socket.bind(('127.0.0.1', 12345))
print('Server is listening...')
while True:
#接收客户端消息
message, client_address = server_socket.recvfrom (1024) # 接收数据和客户端地址
print (f'Received message: {message.decode ("utf-8")}')
#发送响应
server_socket.sendto (b'Hello, UDP Client', client_address) # 向客户端发送响应
if name == 'main':
udp_server ()

四、小案例:简易聊天应用

1. TCP 聊天客户端

import socket

host = '192.168.10.101'  # 服务器IP地址
port = 12345             # 端口号

# 创建TCP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect((host, port))
print(f"已连接到服务器 {host}:{port}")

# 发送和接收消息
send_data = input('输入消息(输入bye结束):')
s.send(send_data.encode())  # 发送消息给服务器
while send_data != 'bye':
    info = s.recv(1024).decode()  # 接收服务器消息
    if info:
        print(f'收到服务器消息:{info}')
        if info == 'bye':
            break
        send_data = input('输入消息(输入bye结束):')
        s.send(send_data.encode())  # 发送消息给服务器

# 关闭连接
s.close()    

2. TCP 聊天服务器

import socket

host = '192.168.10.101'  # 服务器IP地址
port = 12345             # 端口号

# 创建TCP套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口
s.bind((host, port))
# 开始监听,最大连接数为1
s.listen(1)

print(f"服务器启动,监听地址:{host}:{port}")
print("等待客户端连接...")

# 接受客户端连接
sock, addr = s.accept()
print(f"客户端 {addr} 连接成功")

# 接收和发送消息
info = sock.recv(1024).decode()  # 接收客户端消息
while info != 'bye':
    if info:
        print(f'收到客户端消息:{info}')
        send_data = input('回复消息:')
        sock.send(send_data.encode())  # 发送消息给客户端
        if send_data == 'bye':
            break
    info = sock.recv(1024).decode()  # 继续接收客户端消息

# 关闭连接
sock.close()
s.close()    
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐