L'exemple de cet article décrit la méthode de copie de fichiers entre deux serveurs en Java. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
Habituellement, la fonction de copie de fichiers que nous utilisons le plus est la fonction de copie de fichiers entre les mêmes serveurs. Ce qui est introduit ici est la mise à niveau fonctionnelle de la copie de fichiers ordinaire, qui peut réaliser la copie de fichiers entre deux serveurs.
1. Côté serveur
Copiez le code comme suit : package sterning ;
importer java.io.BufferedInputStream ;
importer java.io.DataInputStream ;
importer java.io.DataOutputStream ;
importer java.io.File ;
importer java.io.FileInputStream ;
importer java.net.ServerSocket ;
importer java.net.Socket ;
classe publique ServerTest {
port entier = 8821 ;
vide start() {
Prise s = nulle ;
essayer {
ServerSocket ss = nouveau ServerSocket(port);
tandis que (vrai) {
//Sélectionner les fichiers à transférer
Chaîne filePath = "D://lib.rar" ;
Fichier fi = nouveau fichier (filePath);
System.out.println("Longueur du fichier :" + (int) fi.length());
// Le socket public accepte() est lancé
// IOException écoute et accepte les connexions à ce socket. Cette méthode se bloque jusqu'à ce qu'une connexion soit établie.
s = ss.accepter();
System.out.println("Établir une connexion socket");
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()));
dis.readByte();
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(s.getOutputStream());
//Transmet le nom et la longueur du fichier au client. Pour être réellement applicable à toutes les plateformes, le traitement des noms chinois, par exemple, nécessite toujours un traitement. Pour plus de détails, veuillez vous référer au code prêt à l'emploi dans Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int tailletampon = 8192 ;
octet[] buf = nouvel octet[bufferSize];
tandis que (vrai) {
int lire = 0 ;
si (fis != nul) {
read = fis.read(buf);
}
si (lire == -1) {
casser;
}
ps.write(buf, 0, lecture);
}
ps.flush();
// Attention à fermer le lien socket, sinon le client attendra les données du serveur.
// Jusqu'à ce que le socket expire, ce qui entraîne des données incomplètes.
fis.close();
s.close();
System.out.println("Transfert de fichiers terminé");
}
} attraper (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2. Classe auxiliaire utile de socket
Copiez le code comme suit : package sterning ;
importer java.net.* ;
importer java.io.* ;
classe publique ClientSocket {
IP de chaîne privée ;
port international privé;
socket privé socket = null ;
DataOutputStream out = null ;
DataInputStream getMessageStream = null ;
public ClientSocket (String ip, port int) {
this.ip = ip;
ceci.port = port ;
}
/** *//**
* Créer une connexion socket
*
* @throwsException
* exception
*/
public void CreateConnection() lève une exception {
essayer {
socket = nouveau Socket(ip, port);
} attraper (Exception e) {
e.printStackTrace();
si (socket != nul)
socket.close();
lancez e;
} enfin {
}
}
public void sendMessage (String sendMessage) lève une exception {
essayer {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
retour;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
retour;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} autre {
out.writeUTF(sendMessage);
out.flush();
}
} attraper (Exception e) {
e.printStackTrace();
si (out != null)
out.close();
lancez e;
} enfin {
}
}
public DataInputStream getMessageStream() lève une exception {
essayer {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
retourner getMessageStream ;
} attraper (Exception e) {
e.printStackTrace();
si (getMessageStream != null)
getMessageStream.close();
lancez e;
} enfin {
}
}
public void shutdownConnection() {
essayer {
si (out != null)
out.close();
si (getMessageStream != null)
getMessageStream.close();
si (socket != nul)
socket.close();
} attraper (Exception e) {
}
}
}
3.Client
Copiez le code comme suit : package sterning ;
importer java.io.BufferedOutputStream ;
importer java.io.DataInputStream ;
importer java.io.DataOutputStream ;
importer java.io.FileOutputStream ;
classe publique ClientTest {
ClientSocket privé cs = null ;
private String ip = "localhost";//Défini sur l'IP du serveur private int port = 8821;
chaîne privée sendMessage = "Windwos" ;
public ClientTest() {
essayer {
si (createConnection()) {
envoyerMessage();
getMessage();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
privé booléen createConnection() {
cs = nouveau ClientSocket(ip, port);
essayer {
cs.CreateConnection();
System.out.print("Connexion au serveur réussie !" + "/n");
renvoie vrai ;
} attraper (Exception e) {
System.out.print("Échec de la connexion au serveur !" + "/n");
renvoie faux ;
}
}
privé vide sendMessage() {
si (cs == nul)
retour;
essayer {
cs.sendMessage(sendMessage);
} attraper (Exception e) {
System.out.print("Échec de l'envoi du message !" + "/n");
}
}
privé vide getMessage() {
si (cs == nul)
retour;
DataInputStream inputStream = null ;
essayer {
inputStream = cs.getMessageStream();
} attraper (Exception e) {
System.out.print ("erreur de cache de message de réception/n");
retour;
}
essayer {
//Chemin de sauvegarde local, le nom du fichier sera automatiquement hérité du serveur.
Chaîne savePath = "E://";
int tailletampon = 8192 ;
octet[] buf = nouvel octet[bufferSize];
int passélen = 0;
longueur = 0 ;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("La longueur du fichier est :" + len + "/n");
System.out.println("Commencer à recevoir les fichiers !" + "/n");
tandis que (vrai) {
int lire = 0 ;
si (inputStream != null) {
read = inputStream.read(buf);
}
passélen += lire;
si (lire == -1) {
casser;
}
//La barre de progression ci-dessous est initialement conçue pour la prograssBar de l'interface graphique. Si vous imprimez un fichier ici, certains des mêmes pourcentages peuvent être imprimés à plusieurs reprises.
System.out.println("Fichier reçu" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, lecture);
}
System.out.println("Réception terminée, fichier enregistré sous" + savePath + "/n");
fileOut.close();
} attraper (Exception e) {
System.out.println("Erreur lors de la réception du message" + "/n");
retour;
}
}
public static void main(String arg[]) {
nouveau ClientTest();
}
}
J'espère que cet article sera utile à la programmation Java de chacun.