1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
import threading
import socket
import os
import time
#------------------------------------------------------
class threadReception(threading.Thread): #thread de reception pour chaque connexion existante
def __init__(self, envoi, add, conn):
threading.Thread.__init__(self)
self.addresse = add #adresse pour recuperer la connexion / supprimer
self.connexion = conn #csocket de communication (unique a chaque connexion)
self.envoi = envoi #héritage du self
self.isALive = True
def run(self):
while self.isALive:
message = self.connexion.recv(1024).decode('utf8') #on recoit les infos de cet communication
if not message:
pass
else:
print(message)
self.connexion.close() #on ferme le socket
del self.envoi.connectedList[self.addresse] #on suprime la connexion du dictionnaire
class serveur(threading.Thread): #classe de base, pour mika
def __init__(self, ip, port = 22000): #initialisation de l'ip, port
threading.Thread.__init__(self)
self.IP = ip
self.PORT = port
self.connectedList = {} # {'adresse':connexion} creation du dictionnaire qui comporte l'adresse et le socket connexion d'un appareil
self.mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #création du socket
#self.mySocket.settimeout(0.2) #timeout pour ne pas blocquer le while plus tard
self.serverALive = True #activation du while
def run(self): #methode a lancer pour tout initialiser
print('serveur start')
try:
self.mySocket.bind((self.IP, self.PORT)) #bind du socket sur l'ip et le port
except Exception as e:
print(e)
return False
while self.serverALive: #tant que le serveur est en vie,
try:
self.mySocket.listen(10)
connexion, adresse= self.mySocket.accept() #connexion : socket de comunication, addresse liste [ip, port]
self.connectedList[adresse[0]] = connexion #enregistre dans le dico le socket de connexion avec l'adresse en clée
threadReception(self, adresse[0], connexion).start() #on lance le thread de reception pour chaque connexion
except Exception as e:
print(e)
def stop(self): #lorsqu'on étein la table, on etein le serveur
self.serverALive = False
self.mySocket.close()
print('serveur deconecter')
def getConnected(self): #renvoie la liste des appareils connectés (clée du dico)
lis = []
for i in self.connectedList:
lis.append(i)
return lis
def send(self, appareil, message): #méthode pour envoyer un message à l'adresse choisie
try:
self.connectedList[appareil].send(message.encode('utf8')) #envoi du message
except Exception as e:
print (e)
print ('appareil faux/ pb de connexion')
def sendFile(self, appareil, nom, chemindesti): #envoi de fichiers
try:
nom = nom.split('/')[-1]
fichier = open('/home/justin/Sun_partage/'+appareil+'/'+nom, 'rb') #verifie si fichier existe
fichier.close()
self.connectedList[appareil] #verifie si l'appareil existe
__sendFile(appareil, nom, chemindesti)
except Exception as e:
print(e)
print('fichier inhexistant / chemin faux / appareil faux')
def __sendFile(self, appareil, nom, chemindesti):
connexion = self.connectedList[appareil]
chemin = '/home/justin/Sun_partage/'+appareil+'/'+nom
fichier = open(chemin, 'rb')
octets = os.path.getsize(chemin)
num = 0
parametres = 'transfer de fichiers.' + nom + '.' + str(octets) + '.' + chemindesti
connexion.send(parametres.encode('utf8'))
msg = connexion.recv(1024).decode('utf8')
if msg == 'go':
if octets > 1024:
for i in range(octtes/1024):
fichier.seek(num, 0)
donnee = fichier.read(1024)
connexion.send(donnee)
num += 1024
else:
donnee = fichier.read()
connexion.send(donnee)
fichier.close()
connexion.send('F'.encode('utf8'))
a = serveur('localhost', 8000)
a.start()
while 1:
listen = a.getConnected()
if len(listen)>0:
listen = listen[0]
msg = input('> ')
a.send(listen,msg) |
Partager