import logging import socket import threading import json LOGGER = logging.getLogger(__name__) def judge_napt_type_server(port, host="0.0.0.0"): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind((host, port)) while True: data, addr = server_socket.recvfrom(1024) LOGGER.info("receive data: %s from %s" % (data, addr)) server_socket.sendto("%s:%d" % addr, addr) def p2p_server(port, host="0.0.0.0"): server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind((host, port)) CLIENTS = {} while True: data, addr = server_socket.recvfrom(1024) request = json.loads(data) op = request["op"] if op == "register": CLIENTS[request["name"]] = addr server_socket.sendto(json.dumps({"code": 0}), addr) elif op == "unregister": ret = 0 if CLIENTS.pop(request["name"], None) else 1 server_socket.sendto(json.dumps({"code": ret}), addr) elif op == "get_peer_by_name": peer = CLIENTS.get(request["name"]) if peer == None: server_socket.sendto(json.dumps({"code": 1, "msg": "name is not found"}), addr) else: server_socket.sendto(json.dumps({"code": 0, "peer": peer}), addr) elif op == "prepare": name = request["name"] LOGGER.info("send prepare to: (%s:%d)" % CLIENTS[name]) server_socket.sendto(json.dumps({"op": "prepare", "peer": addr}), CLIENTS[name]) elif op == "prepare_ok": peer = tuple(request["peer"]) LOGGER.info("send prepare_ok to (%s:%d)" % peer) server_socket.sendto(json.dumps({"code": 0, "peer": addr}), peer) if __name__ == "__main__": logging.basicConfig( level=logging.DEBUG, format="%(threadName)s [%(asctime)s] %(message)s", datefmt="%F %T") for port in [8082, 8083]: t = threading.Thread(target=judge_napt_type_server, args=(port, )) t.setDaemon(True) t.start() p2p_server(8081)