TCP/UDP编程

2 阅读2分钟

本文基于Python的socket库,介绍TCP和UDP两种网络编程的基本原理和实现方法。

TCP编程

基本概念

  • TCP是面向连接的可靠传输协议
  • 通信双方分为客户端和服务器
  • 需要建立连接后才能传输数据

客户端实现

import socket

# 创建TCP socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect(('www.sina.com.cn', 80))
# 发送HTTP请求
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 接收数据
data = s.recv(1024)
# 关闭连接
s.close()

服务器实现

import socket
import threading

def handle_client(sock, addr):
    while True:
        data = sock.recv(1024)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()

# 创建服务器socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 9999))
s.listen(5)

while True:
    sock, addr = s.accept()
    # 为每个客户端创建新线程
    t = threading.Thread(target=handle_client, args=(sock, addr))
    t.start()

UDP编程

基本概念

  • UDP是无连接的不可靠传输协议
  • 传输速度快,适合对可靠性要求不高的场景
  • 不需要建立连接,直接发送数据包

服务器实现

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 9999))

while True:
    data, addr = s.recvfrom(1024)  # 接收数据和客户端地址
    s.sendto(b'Hello, %s!' % data, addr)  # 发送回应

客户端实现

import socket

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

for data in [b'Michael', b'Tracy', b'Sarah']:
    s.sendto(data, ('127.0.0.1', 9999))  # 发送数据
    print(s.recv(1024).decode('utf-8'))  # 接收回应

s.close()

核心区别

特性TCPUDP
连接方式面向连接无连接
可靠性可靠传输可能丢失数据
速度相对较慢相对较快
使用场景网页浏览、文件传输视频流、DNS查询

关键要点

  1. TCP需要先建立连接,UDP直接发送数据
  2. 服务器需要绑定端口并监听连接
  3. TCP服务器通常需要多线程处理并发连接
  4. UDP使用sendto()recvfrom()方法
  5. 同一台机器上的TCP和UDP端口互不冲突