import socket import sys import os def start_server(ip, port): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) addr = (ip, port) server_socket.bind(addr) print(f"\033[42m[服务端]\033[0m {ip}:{port},等待连接……") while True: # 建立连接 (模拟握手) (data, client_addr) = server_socket.recvfrom(1024) (client_ip, client_port) = client_addr if data.decode('utf-8', errors='ignore') == "SYN": print(f"\033[42m[服务端]\033[0m 来自客户端 {client_ip}:{client_port} 的连接请求") server_socket.sendto("SYN-ACK".encode('utf-8'), client_addr) else: continue # 接收元数据 META、文件名、大小 data, client_addr = server_socket.recvfrom(2048) try: _, filename, filesize = data.decode('utf-8').split('|') filesize = int(filesize) save_filename = f"{os.path.basename(filename)}" ####### print(f"\033[42m[服务端]\033[0m 接收数据:{filename}({filesize} 字节)……") server_socket.sendto("META-ACK".encode('utf-8'), client_addr) except: continue # 传输数据 received = 0 with open(save_filename, 'wb') as f: while received < filesize: chunk, _ = server_socket.recvfrom(2048) if chunk == b"FIN": break f.write(chunk) received += len(chunk) print(f"\033[42m[服务端]\033[0m 保存文件:{save_filename}") # 释放连接(模拟挥手) data, _ = server_socket.recvfrom(1024) if data.decode('utf-8', errors='ignore') == "FIN": print("\033[42m[服务端]\033[0m 断开连接") server_socket.sendto("FIN-ACK".encode('utf-8'), client_addr) print(f"\033[42m[服务端]\033[0m {ip}:{port},等待连接……") # break # 可加可不加 if __name__ == "__main__": (ip, port) = "0.0.0.0", 7474 if len(sys.argv) > 1: try: (ip, port) = sys.argv[1].split(':') port = int(port) except ValueError: print("【错误】地址格式应为 IP:端口") sys.exit(1) start_server(ip, port)