Python P2P сокет программирования и централизованный сервер - PullRequest
0 голосов
/ 01 марта 2020

Привет. Я пытаюсь создать приложение для централизованного однорангового чата, сервер которого отслеживает одноранговые узлы на net. И если сервер выходит из строя, одноранговый узел заменит сервер, а если нет, то локальный шланг станет сервером. Однако, когда я запускаю свое приложение, оно просто говорит «Системе не удалось установить sh какое-либо соединение, пожалуйста, попробуйте еще раз» постоянно, и оно не устанавливает sh никакого соединения. Я не могу решить проблему, я был бы признателен, если что-то мне не хватает.

import sys
import threading
import socket
import time
import random


class Server:
    connections = []
    peers = []
    def __init__(self):
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        #if lose connection we can reuse the same socket
        socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
        socket.bind(('127.0.0.1',55555))
        socket.listen(1)
        print("Server has is established...")
        while True:
            conn, addr = socket.accept()
            conn_Thread = threading.Thread(target=self.handler, args=(conn,addr))
            conn_Thread.daemon = True
            conn_Thread.start()
            self.connections.append(conn)
            #add the port address and the peer address to the list of peer
            self.peers.append(addr[0])
            print(str(addr[0]) + ":" + str(addr[1]), "connected to server")
            self.send_peers()

    def handler(self, conn, addr):
        while True:
            data = conn.recv(1024)
            for connections in self.connections:
                connections.send(data)
            if not data:
                print(str(addr[0]) + ":" + str(addr[1]), "disconnected from server")
                self.connections.remove(conn)
                self.peers.remove(addr[0])
                conn.close()
                self.send_peers()
                break

    def send_peers(self):
        peer = ""
        for peer in self.peers:
            p = p + peer + ","
        for connection in self.connections:
            connection.send(b'\x11' + bytes(p,'utf-8'))

class Client:

    def send_msg(self, socket):
        while True:
            socket.send(bytes(input(""),'utf-8'))

    def __init__(self, addr):
        socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        socket.connect((addr, 55555))

        client_Thread = threading.Thread(target=self.send_msg, args=(socket,))
        client_Thread.daemon = True
        client_Thread.start()

        while True:
            data = socket.recv(1024)
            if not data:
                break
            if data[0:1] == b'\x11':
                self.update_peer_list(data[1:])

            else:
                print(str(data,'utf-8'))

    def update_peer_list(self, peer_data):
        p2p.peers = str(peer_data, 'utf-8').split(',')[:-1]

class p2p:
    peers = ['127.0.0.1']

while True:
    try:
        print("Trying to establish new connection with peers...")
        time.sleep(3)
        #Tries to make one the peers the server 
        for peer in p2p.peers:
            try:
                client = Client(peer)
            except KeyboardInterrupt:
                sys.exit(0)
            except:
                pass
            #if unsuccessful the centralized server(Us) will try to become the server
            #however all other peers will also try to become the server  
            try:
                server = Server()
            except KeyboardInterrupt:
                sys.exit(0)
            except:
                print("System was not able to establish any connection please try again")   
    except KeyboardInterrupt:
        sys.exit(0)
...