Java socket

Epic_sans.fr -  
 Epic_sans.fr -
Bonjour,

je souhaites envoyer des fichiers (documents, photos, fichiers textes) automatiquement d'un point a à un point b.
J'ai découvert les servers sockets mais ne sait rien d'eux.. j'ai recopier bêtement un programme, le voici:

le serveur:
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/*
* www.codeurjava.com
*/
public class server {
 
 
   public static void main(String[] test) {

  try {
   ServerSocket server = new ServerSocket(4444);
   server.setSoTimeout(4000);
   Socket s = server.accept();
   BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
   System.out.println(in.readLine());
   server.bind(new InetSocketAddress("localhost", 4445));
   FileChannel fc = new FileOutputStream("/home/lukas/Téléchargements/logo.png").getChannel();
   fc.transferFrom((ReadableByteChannel) s, 0, Long.MAX_VALUE);
       
   server.close(); 
   s.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
  
    
   }
}

Le client:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.FileChannel;
import java.nio.channels.SocketChannel;

public class main {

   public static void main(String[] args) {

     try (SocketChannel sc = SocketChannel.open(new InetSocketAddress(
             "localhost", 4444));
             FileChannel fc = new FileInputStream("/home/lukas/Téléchargements/logo.png").getChannel()) {
         fc.transferTo(0, fc.size(), sc);
     } catch (IOException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
     System.out.println("File Transfered...");

    try {
  Socket socket = new Socket("localhost", 4445); 
  
  PrintWriter write = new PrintWriter(socket.getOutputStream());
  write.println(new File("/home/lukas/Téléchargements").exists());
  write.flush(); 
  socket.close();
 } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
    
  }
}

s'il vous plait, aidez moi (ne faîtes pas un programme à ma place si vous ne le voulez pas, mais au moins, redirigez moi vers un site, une video, une serie qui m'apprendras comment faire ou juste enseignez moi les bases pour que je puisse arriver à mes fins. pas juste transferer des textes mais des images.) Mon but est de créer un programme qui, automatiquement, prends des fichiers du "client" et me les envoies via le serveur, les stock et que je puisse les recupérés.
Configuration: Linux / Firefox 79.0
A voir également:

4 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
Bonjour,

"ne faîtes pas un programme à ma place si vous ne le voulez pas, mais au moins, redirigez moi vers un site"
Pas la peine de te faire un programme exprès, je l'ai déjà fait il y a quelques années sur ce même forum...

https://forums.commentcamarche.net/forum/affich-22960561-envoi-des-fichiers-par-des-sockets-java#3
0
Epic_sans.fr
 
Bonjour, je le sais et je l'ai vu.. je ne sais tout simplement pas comment l'executer(je sais qu'il faut d'abord lancer le serveur, puis après le client sur le meme port , mais après je n'en sais rien.. je ne saurais pas le reproduire et meme pas l'expliquer.) pourriez vous me faire une explication très détaillée de votre code s'il vous plait ? et.. si possible me rediriger où vous avez obtenu ses connaissances, je déteste recopier du code bêtement, ça me frustre de ne pas comprendre ! (ps: j'ai beaucoup de questions et j'ai peur que celles ci encombrent le forum. pourriez vous m'envoyer un message sur intagram**********) afin que je puisse les poser ?)

Adresse Instagram supprimée par la modération CCM - l'aide se fait sur le forum, Demande contraire à la charte du site !
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Bonjour,

J'ai repris le programme cité précédemment, j'en ai profité pour le mettre au goût du jour, parce que c'était du code Java 6 (normal en 2011), on peut faire un peu mieux depuis.

Donc effectivement il faut d'abord démarrer le serveur.

import java.net.*;
import java.nio.file.*;
import static java.util.logging.Logger.getGlobal;

public class Serveur {
    public static void main(String... args) throws Exception {
        InetAddress serverAddress = InetAddress.getLocalHost(); // L'adresse du serveur où envoyer le fichier
        int serverPort = 9001; // Le port où le serveur doit attendre les connexions
        Path filePath = Paths.get("D:/testServer.jpg"); // Le chemin d'accès où enregistrer le fichier cible

        try (ServerSocket serverSocket = new ServerSocket(serverPort)) { // Démarrage du serveur qui va attendre une connexion
            getGlobal().info("Le serveur est démarré, un client peut se connecter sur le port " + serverPort + " de " + serverAddress );
            try (Socket socket = serverSocket.accept()) { // On attend la connexion d'un client et on l'accepte dès qu'elle arrive
                getGlobal().info("Connexion réussie avec le client " + socket.getInetAddress());
                Files.copy(socket.getInputStream(), filePath, StandardCopyOption.REPLACE_EXISTING); // On récupère le fichier du client et on l'enregistre
                getGlobal().info("Réception du fichier terminé : " + filePath);
            }
            getGlobal().info("Le client est déconnecté");
        }
        getGlobal().info("Le serveur est arrêté");
    }
}

Une fois prêt le serveur affiche le nom de la machine et son adresse IP ainsi que le port sur lequel il écoute :
INFOS: Le serveur est démarré, un client peut se connecter sur le port 9001 de PC-KX/192.168.1.1

Il faut donc ensuite démarrer le client avec la même configuration :
import java.net.*;
import java.nio.file.*;
import static java.util.logging.Logger.getGlobal;

public class Client {
    public static void main(String[] args) throws Exception {
        String serverNameOrIp = "PC-KX"; // le nom ou l'adresse IP du serveur où envoyer le fichier
        int serverPort = 9001; // Le port où le serveur attend la connexion
        Path filePath = Paths.get("D:/testClient.jpg"); // Le chemin d'accès du fichier à envoyer au serveur
        
        getGlobal().info("Identification du serveur par son nom ou son adresse IP : " + serverNameOrIp);
        InetAddress serverAddress = InetAddress.getByName(serverNameOrIp); // L'adresse du serveur où envoyer le fichier
        getGlobal().info("Tentative de connexion sur le port " + serverPort + " de " + serverAddress);
        try (Socket socket = new Socket(serverAddress, serverPort)) { // Ouverture d'une connexion avec le serveur
            getGlobal().info("Connexion réussie au serveur " + socket.getInetAddress());
            Files.copy(filePath, socket.getOutputStream()); // Copie du fichier vers le serveur
            getGlobal().info("Envoi du fichier terminé : " + filePath);
        }
        getGlobal().info("La connexion est terminée");
    }
}

Si tout fonctionne bien, le fichier D:/testClient.jpg sur le PC où s'exécute le programme client sera copié vers le fichier D:/testServer.jpg du PC où s'exécute le programme serveur.

Attention : pour que les deux PC puissent communiquer entre eux, ils doivent être sur le même réseau. Il est par exemple exclu d'utiliser ce système de communication au travers d'internet, à moins que l'adresse du serveur ne soit une IP publique référencée via un nom de domaine.
0
Epic_sans.fr
 
très bien, je vais essayer de comprendre tout ça, merci à vous et bonne journée !
0
Epic_sans.fr
 
Bon, j'ai compris le programme, il fonctionne très bien. seul petit problème.. on ne peut pas envoyer de dossiers.
0
Epic_sans.fr
 
Comment pourrais-je "réparer" ça et à quoi est du cette erreur ?
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Un fichier c'est un ensemble d'octets stockés sur le disque, les sockets permettent de transférer des octets sur le réseau, donc les deux ensemble fonctionnent plutôt bien.
Mais un dossier c'est bien plus compliqué, car au delà des octets de chaque fichier pris séparément, il y a la structure du dossier, à commencer par le nom des fichiers.
Pour traiter un dossier plutôt qu'un fichier il faut faire évoluer le programme, car pour l'instant c'est un exemple très simple, mais forcément plus tu vas vouloir enrichir ton besoin plus le programme va être compliqué.
Ici, il va falloir transférer via les sockets davantage de données que le seul contenu du fichier, puisqu'il faut rajouter a minima le nom du fichier. Sans oublier bien sûr de faire une boucle pour pas que le serveur ne s'arrête après la fin du premier fichier reçu.

Techniquement je t'orienterai vers les ObjectInputStream et ObjectOutputStream pour la partie socket à proprement parler, et pour aller plus loin j'irai vers les WatchService pour automatiquement détecter les modifications d'un fichier et transférer les modifications sur le serveur.

NB. Soyons honnêtes, si je devais faire moi même ce genre de programme je ne m'embêterai pas à créer un serveur en traitant directement les sockets, c'est très bas niveau, il existe de nombreux outils en Java - et notamment en JEE - pour faire de la communication client serveur sans avoir à réinventer la roue à chaque fois.
0
Epic_sans.fr
 
très bien, je vais voir ça ! je vais surement revenir ici pour..et bien me renseigner d'avantage ! x)
0