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);
  }
}