Привет. Я пытаюсь создать приложение для централизованного однорангового чата, сервер которого отслеживает одноранговые узлы на 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)