func app(nfd int, sa s.Sockaddr) { defer s.Close(nfd) //inet4 := sa.sockaddr(). //s.SockaddrInet4{Port: sa.Port, Addr: sa.Addr} fmt.Printf("%v", sa) conn := util.SetConn(nfd) // Envoie de l'acknowledge pour lancer la synchro for { if conn.Write([]byte{42}) == nil { break } } fmt.Println("Nouveau socket :\n\t", sa) size, err := conn.Readbuffer(8) lenght := util.BigInt(size, 0) // conversion des 8 octets en entier file, err := conn.Readbuffer(lenght) // Création du json //err := ioutil.WriteFile("./config.json", file, 0644) //check(err) // Création de la structure clientListRep, err := util.BytesToFol(file) check(err) // Calcul des différences diff2, del1 := util.CompareDir(clientListRep, mainFolder, lastUpdate) diff1, del2 := util.CompareDir(mainFolder, clientListRep, lastUpdate) fmt.Println("\n*** Calcul des fichiers à mettre à jour client vers serveur ***") fmt.Println(diff2) fmt.Println("\n*** Fichiers à supprimer sur le serveur ***") fmt.Println(del2) fmt.Println("\n*** Calcul des fichiers à mettre à jour serveur vers client ***") fmt.Println(diff1) fmt.Println("\n*** Fichiers à supprimer sur le client ***") fmt.Println(del1) //toDel := del2.Parcours() // Envoi de la structure diff2 buff1, err := diff2.ToBytes() check(err) err = conn.Write(util.Int64toByte(len(buff1))) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) err = conn.Write(buff1) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) toGet := diff2.Parcours() fmt.Println("Diff2 envoyé") // Envoi de la structure diff1 buff2, err := diff1.ToBytes() check(err) err = conn.Write(util.Int64toByte(len(buff2))) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) err = conn.Write(buff2) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) toSend := diff1.Parcours() fmt.Println("Diff1 envoyé") // Envoi de la structure del1 buff3, err := del1.ToBytes() check(err) err = conn.Write(util.Int64toByte(len(buff3))) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) err = conn.Write(buff3) check(err) _, err = conn.Readbuffer(1) // acknowledgment check(err) fmt.Println("Del1 envoyé") // Suppression des fichiers del2 /*for _, file := range toDel { fmt.Println("Suppression de ", file.Nom) check(util.DeleteFile(file.Nom)) }*/ // Réception des fichiers diff2 for _, file := range toGet { fmt.Println("Reception de ", file.Nom) newfile, err := conn.DownloadFile() check(err) check(util.WriteFile(file.Nom, newfile)) } // Envoie des fichiers diff1 for _, file := range toSend { fmt.Println("Envoi de ", file.Nom) err = conn.UploadFile(file.Nom) check(err) } // mise à jour de l'heure de dernière synchronisation lastUpdate = time.Now() currentTime, err := json.Marshal(lastUpdate) check(err) check(util.WriteFile(LASTUPFOLDER, currentTime)) fmt.Println("Synchronisation effectuée avec succès !") }
func main() { fmt.Printf("Demarrage client") check(os.MkdirAll(FOLDER, 0777)) // Scan du répertoire à synchroniser var listRep util.Fol err := util.ScanDir(FOLDER, &listRep) check(err) b, err := listRep.ToBytes() check(err) // Etablissement de la connexion au serveur var conn util.Conn err = conn.Dial(PORT, ADDR) check(err) defer conn.Close() // Attente d'une réponse serveur for { ack, err := conn.Readbuffer(1) check(err) if len(ack) == 1 && ack[0] == 42 { break } } // Envoi de l'arborescence sous forme de Json fmt.Printf("\nEnvoi de l'arborescence\n\n") err = conn.Write(util.Int64toByte(len(b))) check(err) err = conn.Write(b) check(err) // Réception du calcul des différences fmt.Printf("Réception du calcul des différences...") // diff1 tmp, err := conn.DownloadFile() // téléchargement d'un fichier check(err) diff1, err := util.BytesToFol(tmp) // conversion en structure Fol check(err) toSend := diff1.Parcours() // tableau des fichiers à envoyer fmt.Println(toSend) // diff2 tmp2, err := conn.DownloadFile() check(err) diff2, err := util.BytesToFol(tmp2) check(err) toGet := diff2.Parcours() fmt.Println(toGet) // del 1 tmp3, err := conn.DownloadFile() check(err) del, err := util.BytesToFol(tmp3) check(err) toDel := del.Parcours() fmt.Println(toDel) // Suppression des fichiers locaux /*for _, file := range toDel { fmt.Println("Suppression de ", file.Nom) check(util.DeleteFile(file.Nom)) }*/ // Envoi des fichiers client vers serveur for _, file := range toSend { fmt.Println("Envoi de ", file.Nom) err = conn.UploadFile(file.Nom) check(err) } // Réception des fichiers serveur vers client for _, file := range toGet { fmt.Println("Reception de ", file.Nom) newfile, err := conn.DownloadFile() check(err) check(util.WriteFile(file.Nom, newfile)) } fmt.Println("Synchronisation effectuée avec succès.") }