Dateien über TCP übertragen - Spiderlinker/HS-Harz_Multimedia-Infrastrukturen GitHub Wiki
Ausgangssituation
Es sollen Dateien von einem Computer (Server) zu einem anderen Computer (Client) übertragen werden. Hierzu dient der Computer, der die Dateien bereitstellt, als Server und der Computer, der die Dateien empfangen soll, als Client.
Für die Dateiübertragung soll TCP verwendet werden, damit sichergestellt wird, dass die Datei vollständig und korrekt übertragen wird.
Möglichkeiten von Java
Eine TCP-Verbindung und -Übertragung ist in Java über Sockets
möglich. Der Server erzeugt einen ServerSocket
und der Client einen regulären Socket
.
Technische Umsetzung
Bei der oben beschriebenen Umsetzung verbindet sich der Client mit dem Server. Nach einer erfolgreichen Verbindung beginnt der Server mit der Dateiübertragung zum Client.
Es ist natürlich auch der umgekehrte Weg denkbar, bei dem der Client die Dateiübertragung zum Server initiiert. Dies ist allerdings für die Übertragung an sich irrelevant.
Server
ServerSocket serverSocket = ServerSocketFactory.getDefault().createServerSocket(SERVER_PORT);
while (true) {
Socket client = serverSocket.accept();
// TODO in neuem Thread bearbeiten, um weitere Verbindungen parallel zuzulassen
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String requestedFile = reader.readLine();
// angefragte Datei in dem Dateisystem lokalisieren
File fileToTransfer = new File(requestedFile);
try (BufferedOutputStream output = new BufferedOutputStream(client.getOutputStream());
BufferedInputStream input = new BufferedInputStream(new FileInputStream(fileToTransfer))) {
final byte[] buffer = new byte[1024 * 8];
int n = -1;
while ((n = input.read(buffer)) != -1) {
output.write(buffer, 0, n);
}
}
// Sobald die Datei übertragen ist, kann die Verbindung zum Client geschlossen
// werden.
// Beachte: Sollte der BufferedReader schon vorher geschlossen werden, so wird
// auch damit einhergehend die gesamte Verbindung zum Client getrennt.
}
Client
Socket socketToServer = SocketFactory.getDefault().createSocket(serverAddress, serverPort);
PrintWriter writer = null;
try {
writer = new PrintWriter(socketToServer.getOutputStream(), true);
writer.println(fileToRequest);
} finally {
if (writer != null) {
writer.flush();
}
}
try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(locationToSaveReceivedFile))) {
BufferedInputStream input = new BufferedInputStream(socketToServer.getInputStream());
byte[] buffer = new byte[1024 * 8];
int n = -1;
while ((n = input.read(buffer)) != -1) {
output.write(buffer, 0, n);
}
}