|
|
@@ -0,0 +1,62 @@
|
|
|
+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)
|