Как вы используете потоковую передачу для связи через одноранговую сеть в Python?

#python #multithreading #networking #p2p #peer

#python #многопоточность #сеть #p2p #одноранговый

Вопрос:

Когда я пытаюсь создать свою P2P-сеть на Python, мой первый одноранговый узел действует как сервер, затем мой следующий одноранговый узел сначала подключается к первому одноранговому узлу в качестве клиента, а затем запускает свой собственный сервер для подключения следующего однорангового узла. Я пытаюсь использовать потоковую передачу, чтобы получить это так после того, как у меня будет несколько подключенных узлов как таковых:

 P1                P2                   P3
[server]         [server]             [server]
      ^----------[client]             [client]
    ^-------------------------------------|
 

Третий одноранговый узел может отправить сообщение первому одноранговому узлу (который действует как сервер), а затем сообщение пересылается первым одноранговым узлом второму одноранговому узлу (действующему как клиент). Я не могу понять, как это сделать.

Мой основной цикл, по сути, таков: join_ip и join_port относятся к текущему одноранговому узлу в сети, к которому должен присоединиться новый, а client_ip и client_port — это входящие IP-адреса и порты одноранговых узлов, которые он должен затем прослушивать

 def main():

    if self.first_peer is False:
        while True:
            t = threading.Thread(self.connect_to_peer(join_ip, join_port)).start()
            t2 = threading.Thread(self.become_server(self.client_ip, self.client_port)).start()

    else:
        while True:
             t = threading.Thread(self.become_server(self.client_ip, self.client_port)).start()

def become_server(self, ip, port):

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((ip, (int(port))))
    sock.listen(1)
    while True:   
        c, a = sock.accept()

def connect_to_peer(self, ip, port):
    peer_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    peer_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    wait_to_connect = True
    while wait_to_connect:
        try:
            t = threading.Thread(peer_sock.connect((ip, (int(port))))).start()
            wait_to_connect = False
        except:
            pass

    self.connections.append((peer_sock, port))

    self.connections_addresses.append((ip, str(int(port))))
    self.connections_count  = 1
 

И затем функция new_connection, упомянутая выше, просто принимает сокет подключения

Комментарии:

1. Но в чем проблема?

2. Нет никаких причин для того, чтобы P2 и P3 были одновременно клиентом и сервером. Они должны быть просто клиентом. Сообщение с сервера может быть либо ответом на запрос, либо сообщением от другого клиента.