Das Beispiel in diesem Artikel beschreibt die Methode zum Kopieren von Dateien zwischen zwei Servern in Java. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
Normalerweise verwenden wir die Funktion zum Kopieren von Dateien zwischen denselben Servern. Hier wird die Funktionserweiterung des normalen Dateikopierens vorgestellt, mit der das Kopieren von Dateien zwischen zwei Servern realisiert werden kann.
1. Serverseitig
Kopieren Sie den Code wie folgt: package sterning;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
java.io.File importieren;
import java.io.FileInputStream;
import java.net.ServerSocket;
java.net.Socket importieren;
öffentliche Klasse ServerTest {
int port = 8821;
void start() {
Socket s = null;
versuchen {
ServerSocket ss = new ServerSocket(port);
while (wahr) {
//Dateien zur Übertragung auswählen
String filePath = "D://lib.rar";
Datei fi = neue Datei(filePath);
System.out.println("Dateilänge:" + (int) fi.length());
// öffentlicher Socket, der von akzeptablen () ausgelöst wird
// IOException wartet auf Verbindungen zu diesem Socket und akzeptiert diese. Diese Methode blockiert, bis eine Verbindung hergestellt wird.
s = ss.accept();
System.out.println("Socket-Verbindung herstellen");
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());
//Übertrage den Dateinamen und die Länge an den Client. Um wirklich auf alle Plattformen anwendbar zu sein, muss beispielsweise die Verarbeitung chinesischer Namen noch verarbeitet werden. Weitere Informationen finden Sie im vorgefertigten Code in Think In Java 4th.
ps.writeUTF(fi.getName());
ps.flush();
ps.writeLong((long) fi.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while (wahr) {
int read = 0;
if (fis != null) {
read = fis.read(buf);
}
if (read == -1) {
brechen;
}
ps.write(buf, 0, read);
}
ps.flush();
// Achten Sie darauf, den Socket-Link zu schließen, da der Client sonst auf Daten vom Server wartet.
// Bis der Socket das Zeitlimit überschreitet, was zu unvollständigen Daten führt.
fis.close();
s.close();
System.out.println("Dateiübertragung abgeschlossen");
}
} Catch (Ausnahme e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new ServerTest().start();
}
}
2. Verwenden Sie die Hilfsklasse des Sockets
Kopieren Sie den Code wie folgt: package sterning;
java.net importieren.*;
java.io.* importieren;
öffentliche Klasse ClientSocket {
private String-IP;
privater int-Port;
privater Socket socket = null;
DataOutputStream out = null;
DataInputStream getMessageStream = null;
public ClientSocket(String ip, int port) {
this.ip = ip;
this.port = port;
}
/** *//**
* Socket-Verbindung erstellen
*
* @throwsException
* Ausnahme
*/
public void CreateConnection() löst eine Ausnahme aus {
versuchen {
socket = neuer Socket(ip, port);
} Catch (Ausnahme e) {
e.printStackTrace();
if (Socket != null)
socket.close();
wirf e;
} Endlich {
}
}
public void sendMessage(String sendMessage) löst eine Ausnahme aus {
versuchen {
out = new DataOutputStream(socket.getOutputStream());
if (sendMessage.equals("Windows")) {
out.writeByte(0x1);
out.flush();
zurückkehren;
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2);
out.flush();
zurückkehren;
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3);
out.flush();
} anders {
out.writeUTF(sendMessage);
out.flush();
}
} Catch (Ausnahme e) {
e.printStackTrace();
if (out != null)
out.close();
wirf e;
} Endlich {
}
}
public DataInputStream getMessageStream() löst eine Ausnahme aus {
versuchen {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
return getMessageStream;
} Catch (Ausnahme e) {
e.printStackTrace();
if (getMessageStream != null)
getMessageStream.close();
wirf e;
} Endlich {
}
}
public void ShutDownConnection() {
versuchen {
if (out != null)
out.close();
if (getMessageStream != null)
getMessageStream.close();
if (Socket != null)
socket.close();
} Catch (Ausnahme e) {
}
}
}
3.Kunde
Kopieren Sie den Code wie folgt: package sterning;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
öffentliche Klasse ClientTest {
privater ClientSocket cs = null;
private String ip = "localhost";//Auf Server-IP setzen private int port = 8821;
privater String sendMessage = "Windwos";
public ClientTest() {
versuchen {
if (createConnection()) {
Nachricht senden();
getMessage();
}
} Catch (Ausnahme ex) {
ex.printStackTrace();
}
}
privater boolescher Wert createConnection() {
cs = new ClientSocket(ip, port);
versuchen {
cs.CreateConnection();
System.out.print("Verbindung zum Server erfolgreich!" + "/n");
return true;
} Catch (Ausnahme e) {
System.out.print("Verbindung zum Server fehlgeschlagen!" + "/n");
return false;
}
}
private void sendMessage() {
if (cs == null)
zurückkehren;
versuchen {
cs.sendMessage(sendMessage);
} Catch (Ausnahme e) {
System.out.print("Nachricht konnte nicht gesendet werden!" + "/n");
}
}
private void getMessage() {
if (cs == null)
zurückkehren;
DataInputStream inputStream = null;
versuchen {
inputStream = cs.getMessageStream();
} Catch (Ausnahme e) {
System.out.print("Fehler beim Empfangen des Nachrichten-Cache/n");
zurückkehren;
}
versuchen {
//Lokaler Speicherpfad, der Dateiname wird automatisch vom Server geerbt.
String savePath = "E://";
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int übergebenlen = 0;
longlen=0;
savePath += inputStream.readUTF();
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong();
System.out.println("Die Länge der Datei ist:" + len + "/n");
System.out.println("Dateien empfangen!" + "/n");
while (wahr) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buf);
}
passlen += read;
if (read == -1) {
brechen;
}
//Der Fortschrittsbalken unten wurde ursprünglich für die PrograssBar der grafischen Benutzeroberfläche erstellt. Wenn Sie hier eine Datei drucken, werden möglicherweise einige der gleichen Prozentsätze wiederholt gedruckt.
System.out.println("Datei empfangen" + (passedlen * 100/ len) + "%/n");
fileOut.write(buf, 0, read);
}
System.out.println("Empfang abgeschlossen, Datei gespeichert als" + savePath + "/n");
fileOut.close();
} Catch (Ausnahme e) {
System.out.println("Fehler beim Empfangen der Nachricht" + "/n");
zurückkehren;
}
}
public static void main(String arg[]) {
neuer ClientTest();
}
}
Ich hoffe, dass dieser Artikel für die Java-Programmierung aller hilfreich sein wird.