
本文共 2680 字,大约阅读时间需要 8 分钟。
UDP 实现
UDP(用户数据包协议)是一种无连接的网络协议,适用于高效数据传输场景。与TCP不同,UDP不需要建立连接,直接向接收方发送数据包。由于缺少连接建立和数据确认机制,UDP的可靠性较低,但其效率高,数据包首部较小,适合对实时性要求较高的场景。
UDP 编程基础
在Python中,UDP编程主要通过socket
模块实现。以下是常用操作步骤:
创建套接字:使用socket.socket()
方法,指定IP地址族和协议类型。例如,socket.AF_INET
表示IPv4,socket.SOCK_DGRAM
表示UDP。
绑定端口:使用bind()
方法将套接字绑定到指定的IP地址和端口。
监听端口:使用listen()
方法开始接收连接。参数表示等待的最大连接数。
接收数据:使用recvfrom()
方法接收数据包,返回数据和发送方的地址信息。
发送数据:使用sendto()
方法发送数据包,指定目标地址和端口。
UDP 实验代码
服务端(udp_server.py)
import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(('0.0.0.0', 8001))while True: data, addr = s.recvfrom(1024) print('接收到的数据:', data.decode()) if data.decode().lower() == 'bye': breaks.close()
客户端(udp_client.py)
import socketimport uuidimport sysdef get_mac_address(): mac = uuid.UUID(int=uuid.getnode()).hex[-12:] return ":".join([mac[i:i+2] for i in range(0, 11, 2)])ip = socket.gethostbyname(socket.gethostname())mac = get_mac_address()s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.sendto(f"IP地址:{ip}\nMAC地址:{mac}".encode(), ('127.0.0.1', 8001))s.close()
TCP 实现
TCP(传输控制协议)是面向连接的、可靠的数据传输协议,适用于对数据完整性和顺序要求较高的场景。TCP的核心特点是可靠性和流量控制。
TCP 套接字操作
服务器端套接字
创建套接字:使用socket.socket()
方法,指定协议类型为SOCK_STREAM
。
绑定地址和端口:使用bind()
方法。
监听端口:使用listen()
方法。
接收连接:使用accept()
方法接收客户端连接。
接收数据:使用recv()
或read()
方法读取数据。
发送数据:使用send()
或sendall()
方法发送数据。
客户端套接字
连接服务器:使用connect()
方法连接指定地址和端口。
发送数据:使用send()
或sendall()
方法。
接收数据:使用recv()
或read()
方法。
关闭连接:使用close()
方法。
TCP 实验代码
服务端(tcp_server.py)
import sockets = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.bind(('0.0.0.0', 8002))s.listen(1)conn, addr = s.accept()print('已连接客户端:', addr)while True: data = conn.recv(1024).decode() print('接收到:', data) c = input('输入回复:') conn.sendall(c.encode()) if c.lower() == 'bye': breakconn.close()s.close()
客户端(tcp_client.py)
import sockettry: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 8002)) while True: c = input('输入信息:') s.sendall(c.encode()) data = s.recv(1024).decode() print('接收到:', data) if c.lower() == 'bye': breakexcept Exception as e: print('连接失败,错误:', e)finally: s.close()
实验结果
运行上述代码可以看到以下效果:
UDP 实验:服务端接收到客户端发送的数据包,客户端发送的信息会直接显示在服务端。
TCP 实验:客户端与服务端之间形成连接,双方可以正常通信,数据传输可靠。
拓展
以下代码用于获取网络信息:
import sockethostname = socket.gethostname()ip = socket.gethostbyname(hostname)ip_bai = socket.gethostbyname('www.baidu.com')host = socket.gethostbyaddr(ip)sername = socket.getservbyport(80, 'tcp')port = socket.getservbyname('http')print(f'gethostname:{hostname}')print(f'gethostbyname:{ip}')print(f'gethostbyname:{ip_bai}')print(f'gethostbyaddr:{host}')print(f'getservbyport:{sername}')print(f'getservbyname:{port}')
发表评论
最新留言
关于作者
