Java socket
Epic_sans.fr
-
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:
Le client:
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.
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:
- Java socket
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
4 réponses
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
"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
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.
Une fois prêt le serveur affiche le nom de la machine et son adresse IP ainsi que le port sur lequel il écoute :
Il faut donc ensuite démarrer le client avec la même configuration :
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.
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.
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.
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.
Adresse Instagram supprimée par la modération CCM - l'aide se fait sur le forum, Demande contraire à la charte du site !