Basics - Lesen / Schreiben von Remote-Dateien mit Java

8

Ich begann mit der Anforderung, Dateien in / aus einem Verzeichnis auf einem entfernten Ubuntu-Rechner zu lesen und zu schreiben.

Zuerst schrieb ich ein Java-Programm, das Dateien aus einem freigegebenen Ordner auf einer entfernten Windows-Maschine, d. h. in einem LAN, lesen und schreiben konnte. Hier funktioniert so etwas auf meinem (lokalen) Windows Rechner:

%Vor%

Wenn ich jetzt einen entfernten Ubuntu-Rechner in Betracht ziehe, kann ich natürlich nicht so etwas tun, da der Rechner nicht im LAN ist ( Ich bin mir nicht sicher, ob das auch im LAN möglich ist !). Daher habe ich folgende Ansätze versucht:

  1. Mit Jsch die Vertrauensstellung zwischen zwei Rechnern herstellen (lokal - remote Linux, remote Linux - remote Linux) und Datei schreiben mit sftp. (done)
  2. Laufende Sockets auf den zwei Rechnern - ein Sender, ein Empfänger (beide Java) (fertig)
  3. Der Versuch, I / O-Code-Snippets für Windows (LAN) -Maschinen zu erreichen (nicht erreicht)

Während ich all dies machte, hatte ich viele Fragen, las viele Beiträge usw. und ich fühlte, dass mir etwas an den Grundlagen fehlte:

  • Um IO zu erreichen, wird eine Art von vertrauensbildenden (zwischen zwei Maschinen) Utility benötigt. Aber schließlich möchte ich einen Code schreiben wie das Snippet, unabhängig von den Maschinen, dem Netzwerk usw.
  • Die Jsch-Lösung und die anderen Vorschläge (Verwendung von http, ftp usw. über URL) verwenden schließlich einige Dienste, die auf dem entfernten Rechner laufen. Mit anderen Worten, es ist NICHT so, dass Java IO für den Zugriff auf das Remote-Dateisystem verwendet wird - das gefällt mir nicht, da ich auf Dienste angewiesen bin, anstatt gute alte I / O zu verwenden.
  • Samba, auch SSHFS tauchte auf, nur um meine Verwirrung zu verstärken. Aber ich sehe sie nicht als die Lösungen für mein Ziel!

Ich wiederhole: Ich möchte einen Code mit Java I / O schreiben (entweder plain oder nio, beide sind in Ordnung), die einfach entfernte Dateien lesen können, ohne Dienste über Protokolle wie ftp, http usw. zu benutzen Socket-Sender-Empfänger-Modell . Ist meine Erwartung gültig?

  • Wenn nicht, warum und was ist das Beste, was ich tun kann, um entfernte Dateien zu lesen / schreiben? Java verwenden?
  • Wenn ja, wie erreiche ich das gleiche!

PS: Bitte kommentieren Sie, falls ich meine Frage genau formulieren muss!

    
Kaliyug Antagonist 27.09.2012, 06:36
quelle

5 Antworten

5

Wenn Sie auf ein Dateisystem auf einem Remote-Computer zugreifen wollen, muss dieser Computer sein Dateisystem mit einem Dienst verfügbar machen. Ein solcher Dienst ist typischerweise ein Hintergrund-Job, der eingehende Anfragen behandelt und eine Antwort, z. zur Authentifizierung, Autorisierung, Lesen und Schreiben. Die Spezifikation des Anfrage- / Antwortmusters wird als Protokoll bezeichnet. Bekannte Protokolle sind SMB (oder SAMBA) unter Windows oder NFS unter UNIX / LINUX. Um auf einen solchen Remote-Service zuzugreifen, mounten Sie das Remote-Dateisystem auf der Ebene des Betriebssystems und stellen es lokal als Laufwerk unter Windows oder als Mount-Point unter UNIX zur Verfügung.

Dann können Sie wie jedes lokale Dateisystem von Ihrem Java-Programm auf das entfernte Dateisystem zugreifen.

Natürlich ist es auch möglich, einen eigenen Dateidienstanbieter (mit Ihrer eigenen Protokollschicht) zu schreiben und auf dem Remote-Rechner auszuführen. Als Transportschicht für ein solches Vorhaben können Sockets (TCP / IP) verwendet werden. Eine andere gute Transportschicht wäre das http-Protokoll, z. mit einem erholsamen Service oder etwas, das auf WebDav basiert.

    
mmehl 05.10.2012, 21:06
quelle
12

Um Ihre Frage zu beantworten - Nein ist Ihre Erwartung nicht gültig.

Das Abrufen von Dateien von einem Remote-Server hängt von den auf diesem Server ausgeführten Diensten ab. Um eine Datei von einem Remote-Server abzurufen, muss der Remote-Server Ihre Anfrage für eine Datei erwarten.

Die Fälle, die Sie in Ihrer Frage (mit jsch und sftp, unter Verwendung von Java-Sockets von Sender und Empfänger) aufgelistet haben, die Sie bereits erreicht haben, sind im Wesentlichen dieselben:

%Vor%

Der einzige Unterschied besteht darin, dass Java die integrierte Unterstützung für das Lesen einer Windows-Freigabe verwendet. Auf dem Remote-Windows-Rechner läuft ein Sharing-Service (genau wie Samba unter Linux oder ein Java-Socket-Programm), der auf Ihre Anfrage wartet.

Aus den Java-API-Dokumenten für File (http://docs.oracle.com/javase/6/docs/api/java/io/File.html)

  

Der kanonische Pfadname einer Datei, die sich auf einer anderen Maschine befindet und auf die über ein Remote-Dateisystem-Protokoll wie SMB oder NFS zugegriffen wird ...

Also im Wesentlichen "Good old Java I / O" ist mehr oder weniger nur ein Wrapper über einige gebräuchliche Protokolle.

Um den zweiten Teil Ihrer Frage zu beantworten (Was kann ich am besten tun, um entfernte Dateien mit Java zu lesen / schreiben?), hängt davon ab, auf welches Remote-System Sie zugreifen und vor allem welche Dienste laufen darauf.

Wenn Ihre Ziel-Remote-Maschine eine Ubuntu-Maschine ist, würde ich sagen, die beste Alternative wäre die Verwendung von Jsch. Wenn Ihr Zielcomputer entweder ein Windows-Rechner oder ein Linux-Rechner sein kann, würde ich wahrscheinlich Java-Sockets auf den beiden Rechnern ausführen (natürlich abhängig davon, ob Sie Zugriff auf die Installation Ihrer App auf dem entfernten Rechner haben).

Gehen Sie im Allgemeinen mit dem gemeinsamen kleinsten Nenner zwischen Ihren Zielsystemen (in Bezug auf Dateifreigabe-Protokolle).

    
Lawrence 10.10.2012 12:25
quelle
2

Wir haben sshfs verwendet. Sie können zu / etc / fstab die Zeile hinzufügen:

sshfs#user@remoteAddress:remoteDir /mnt/ssh fuse defaults 0 0

und dann mount /mnt/ssh

    
Andrzej Jozwik 05.10.2012 21:32
quelle
0

Ich denke, RMI könnte die Lösung sein, Sie könnten einen Server einen RMI-Server auf dem Rechner einrichten, mit dem Sie sich verbinden wollen, und Ihren Rechner als Client verwenden.

Ich würde dem Client einen Pfad zu der Datei geben, der an den Server gesendet wird, der Server könnte dann die Datei als Bytes einlesen und die Datei zurück an den Client senden.

    
Paul 05.10.2012 23:27
quelle
-2

Zunächst müssen Sie die IP-Adresse Ihres Systems und des Remote-Systems pingen. Dann habe ich einfach versucht, die Codierung für das Lesen oder Schreiben von Dateien so zu schreiben, wie es in Ihrem System selbst ist.

    
pandix 23.10.2013 05:56
quelle

Tags und Links