Пример #1
0
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 !")

}
Пример #2
0
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.")
}