| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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)
|