udpserver.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import socket
  2. import sys
  3. import os
  4. def start_server(ip, port):
  5. server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  6. addr = (ip, port)
  7. server_socket.bind(addr)
  8. print(f"\033[42m[服务端]\033[0m {ip}:{port},等待连接……")
  9. while True:
  10. # 建立连接 (模拟握手)
  11. (data, client_addr) = server_socket.recvfrom(1024)
  12. (client_ip, client_port) = client_addr
  13. if data.decode('utf-8', errors='ignore') == "SYN":
  14. print(f"\033[42m[服务端]\033[0m 来自客户端 {client_ip}:{client_port} 的连接请求")
  15. server_socket.sendto("SYN-ACK".encode('utf-8'), client_addr)
  16. else:
  17. continue
  18. # 接收元数据 META、文件名、大小
  19. data, client_addr = server_socket.recvfrom(2048)
  20. try:
  21. _, filename, filesize = data.decode('utf-8').split('|')
  22. filesize = int(filesize)
  23. save_filename = f"{os.path.basename(filename)}" #######
  24. print(f"\033[42m[服务端]\033[0m 接收数据:{filename}({filesize} 字节)……")
  25. server_socket.sendto("META-ACK".encode('utf-8'), client_addr)
  26. except:
  27. continue
  28. # 传输数据
  29. received = 0
  30. with open(save_filename, 'wb') as f:
  31. while received < filesize:
  32. chunk, _ = server_socket.recvfrom(2048)
  33. if chunk == b"FIN": break
  34. f.write(chunk)
  35. received += len(chunk)
  36. print(f"\033[42m[服务端]\033[0m 保存文件:{save_filename}")
  37. # 释放连接(模拟挥手)
  38. data, _ = server_socket.recvfrom(1024)
  39. if data.decode('utf-8', errors='ignore') == "FIN":
  40. print("\033[42m[服务端]\033[0m 断开连接")
  41. server_socket.sendto("FIN-ACK".encode('utf-8'), client_addr)
  42. print(f"\033[42m[服务端]\033[0m {ip}:{port},等待连接……")
  43. # break # 可加可不加
  44. if __name__ == "__main__":
  45. (ip, port) = "0.0.0.0", 7474
  46. if len(sys.argv) > 1:
  47. try:
  48. (ip, port) = sys.argv[1].split(':')
  49. port = int(port)
  50. except ValueError:
  51. print("【错误】地址格式应为 IP:端口")
  52. sys.exit(1)
  53. start_server(ip, port)