import socket
import threading

def receive_udp_message(client_socket):
    while True:
        try:
            data, server_address = client_socket.recvfrom(4096)
            print(f'\nReceived {data} from {server_address}')
            print('>')
        except BlockingIOError:
            pass

def send_udp_message(client_socket, server_address, port, message):
    try:
        message_bytes = bytes.fromhex(message)
        print(f'Sent {message} to {server_address}')
        client_socket.sendto(message_bytes, (server_address, port))
    except BlockingIOError:
        pass

if __name__ == "__main__":
    import sys

    if len(sys.argv) < 3:
        print("Usage: python udp_client.py <server_address> <port>")
        sys.exit(1)

    server_address = sys.argv[1]
    port = int(sys.argv[2])

    # 创建一个套接字对象
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    client_socket.bind(('', 15000))
    # client_socket.setblocking(False)

    recv_thread = threading.Thread(target=receive_udp_message, args=(client_socket,))
    recv_thread.setDaemon(True)
    recv_thread.start()

    while True:
        message = input('> ')
        if message == 'exit':
            break
        send_udp_message(client_socket, server_address, port, message)

    if recv_thread.is_alive():
        recv_thread.join()