Je nach Architektur wird dann allerdings der Main Thread (darin läuft die Applikation) stillgelegt, solange bis der Download fertig ist (keine Benutzereingaben etc. mehr möglich).
http://developer.apple.com/networking/ (hier sind zig Beispiele mit Source Code zu finden, was sicherlich hilfreicher ist als meiner Einer, welcher nicht einmal einen Mac in der Nähe hat :-P)
ich habe schon Erfahrungen in C# was ja ähnlich ist wie Java. Daher würde es mich interessieren, wie ich in Java das lösen könnte.
Vorerst möchte ich erstmal nur das Ansprechen der Schnittstelle in Java probieren.
Kannst du mir da ein Beispiel für Java geben?
import java.io.*;
import java.net.*;
import java.util.Enumeration;
class FileDownload {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(isr);
System.out.println("Below a List of available Network Interfaces is shown: \n");
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
while ( networkInterfaces.hasMoreElements() ) {
System.out.println(((NetworkInterface)networkInterfaces.nextElement()).getName());
}
System.out.println("\n\nEnter a Network Interface Name: ");
NetworkInterface aNetworkInterface = NetworkInterface.getByName(in.readLine());
if ( aNetworkInterface != null ) {
System.out.println("Enter a URL (including the File Name): ");
DownloadThread aDownloadThread = new DownloadThread(in.readLine(), aNetworkInterface);
System.out.println("Downloading file...");
try { Thread.sleep(2000); }
catch(Exception e) {/*do nothing*/}
aDownloadThread.start();
while ( aDownloadThread.isAlive() ) {
try { Thread.sleep(500); }
catch(Exception e) {/*do nothing*/}
}
System.out.println("Download finished.");
}
else {
System.out.println("Could not find Network Interface.");
}
System.out.println("Application terminating...");
}
// DownloadThread
private static class DownloadThread extends Thread {
private String url;
private NetworkInterface networkInterface;
public DownloadThread(String aUrl, NetworkInterface aNetworkInterface) {
url = aUrl;
networkInterface = aNetworkInterface;
}
public void run() {
Enumeration inetAddresses = networkInterface.getInetAddresses();
try {
Socket socket = new Socket((InetAddress)inetAddresses.nextElement(), 8080);
if ( !socket.isConnected() ) {
socket.connect(socket.getLocalSocketAddress(), 2000);
if ( !socket.isConnected() ) {
System.out.println("Could not connect.");
}
}
else {
String receivedData;
URL aUrl = new URL(url);
InputStream is = aUrl.openStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
while ( (receivedData = dis.readLine()) != null ) {
System.out.println(receivedData);
}
is.close();
}
}
catch(Exception e) {
System.out.println("Error = " + e.toString());
}
}
} // DownloadThread
} // FileDownload
Verwendung (über Konsole):
javac FileDownload.java // zum kompilieren
java FileDownload // für die Ausführung
Erklärung:
Die Applikation gibt zuerst die Namen aller Netzwerkschnittstellen aus und verlangt anschliessend nach der Eingabe eines solchen Namens. Danach wird nach der URL gefragt und ein Thread erzeugt, welcher die Datei herunterlädt und deren Inhalt ausgibt, sofern dies möglich ist, ansonsten gibt es eine Fehlermeldung.
PS: Der Code ist keinesfalls als Referenz gedacht, da doch einige unschönheiten (Programmierparadigma, Fehlerbehandlung und vieles mehr) enthalten sind und überhaupt nicht sichergestellt wird, dass die Daten über die richtige Schnittstelle abgeholt werden…aber immerhin ein grobes Grundgerüst, welches als Einstieg hilfreich sein könnte.
Von comfreak • Montag, 03. August 2009, 08:02 UhrHallo,
wenn die Lösung so einfach ist, dass man mir schon Bücher empfiehlt, dann kann man mir doch sicher auch einfacher helfen…
Gruß comfreak
Bevor Du den Programmierkurs gratis im Forum machst - nochmal das Buch von Aaron Hillegass ist für jeden Entwickler empfohlen.
Der Mann war während Jahren - am Schreiben der Dokumentation für Openstep und macht jede Menge Trainings für Entwickler.
Du sparst Jahre - die in der Schweiz keine 10 Entwickler haben.
http://www.bignerdranch.com/instructors/hillegass.shtml
Von sierra2 • Donnerstag, 06. August 2009, 17:57 Uhr
Von comfreak • Montag, 03. August 2009, 08:02 UhrHallo,
wenn die Lösung so einfach ist, dass man mir schon Bücher empfiehlt, dann kann man mir doch sicher auch einfacher helfen…
Gruß comfreak
Bevor Du den Programmierkurs gratis im Forum machst - nochmal das Buch von Aaron Hillegass ist für jeden Entwickler empfohlen.
Der Mann war während Jahren - am Schreiben der Dokumentation für Openstep und macht jede Menge Trainings für Entwickler.
Du sparst Jahre - die in der Schweiz keine 10 Entwickler haben.
http://www.bignerdranch.com/instructors/hillegass.shtml
Solche Bücher besitze ich schon und das ist gut, aber wir sind (mittlerweile) auf Java umgestiegen und sind der Lösung schon nahe bessergesagt haben wir sie schon.
Von sierra2 • Donnerstag, 06. August 2009, 17:57 Uhr
Von comfreak • Montag, 03. August 2009, 08:02 UhrHallo,
wenn die Lösung so einfach ist, dass man mir schon Bücher empfiehlt, dann kann man mir doch sicher auch einfacher helfen…
Gruß comfreak
Bevor Du den Programmierkurs gratis im Forum machst - nochmal das Buch von Aaron Hillegass ist für jeden Entwickler empfohlen.
Der Mann war während Jahren - am Schreiben der Dokumentation für Openstep und macht jede Menge Trainings für Entwickler.
Du sparst Jahre - die in der Schweiz keine 10 Entwickler haben.
http://www.bignerdranch.com/instructors/hillegass.shtml
Nur aus reiner Interesse: Gibt es das Buch auch in Deutsch?
Von hirnstroem • Donnerstag, 06. August 2009, 07:07 Uhr
import java.io.*;
import java.net.*;
import java.util.Enumeration;
class FileDownload {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(isr);
System.out.println("Below a List of available Network Interfaces is shown: \n");
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
while ( networkInterfaces.hasMoreElements() ) {
System.out.println(((NetworkInterface)networkInterfaces.nextElement()).getName());
}
System.out.println("\n\nEnter a Network Interface Name: ");
NetworkInterface aNetworkInterface = NetworkInterface.getByName(in.readLine());
if ( aNetworkInterface != null ) {
System.out.println("Enter a URL (including the File Name): ");
DownloadThread aDownloadThread = new DownloadThread(in.readLine(), aNetworkInterface);
System.out.println("Downloading file...");
try { Thread.sleep(2000); }
catch(Exception e) {/*do nothing*/}
aDownloadThread.start();
while ( aDownloadThread.isAlive() ) {
try { Thread.sleep(500); }
catch(Exception e) {/*do nothing*/}
}
System.out.println("Download finished.");
}
else {
System.out.println("Could not find Network Interface.");
}
System.out.println("Application terminating...");
}
// DownloadThread
private static class DownloadThread extends Thread {
private String url;
private NetworkInterface networkInterface;
public DownloadThread(String aUrl, NetworkInterface aNetworkInterface) {
url = aUrl;
networkInterface = aNetworkInterface;
}
public void run() {
Enumeration inetAddresses = networkInterface.getInetAddresses();
try {
Socket socket = new Socket((InetAddress)inetAddresses.nextElement(), 8080);
if ( !socket.isConnected() ) {
socket.connect(socket.getLocalSocketAddress(), 2000);
if ( !socket.isConnected() ) {
System.out.println("Could not connect.");
}
}
else {
String receivedData;
URL aUrl = new URL(url);
InputStream is = aUrl.openStream();
DataInputStream dis = new DataInputStream(new BufferedInputStream(is));
while ( (receivedData = dis.readLine()) != null ) {
System.out.println(receivedData);
}
is.close();
}
}
catch(Exception e) {
System.out.println("Error = " + e.toString());
}
}
} // DownloadThread
} // FileDownload
Verwendung (über Konsole):
javac FileDownload.java // zum kompilieren
java FileDownload // für die Ausführung
Erklärung:
Die Applikation gibt zuerst die Namen aller Netzwerkschnittstellen aus und verlangt anschliessend nach der Eingabe eines solchen Namens. Danach wird nach der URL gefragt und ein Thread erzeugt, welcher die Datei herunterlädt und deren Inhalt ausgibt, sofern dies möglich ist, ansonsten gibt es eine Fehlermeldung.
PS: Der Code ist keinesfalls als Referenz gedacht, da doch einige unschönheiten (Programmierparadigma, Fehlerbehandlung und vieles mehr) enthalten sind und überhaupt nicht sichergestellt wird, dass die Daten über die richtige Schnittstelle abgeholt werden…aber immerhin ein grobes Grundgerüst, welches als Einstieg hilfreich sein könnte.
Haben den ganzen Code mal ausprobiert, um zu sehen wie’s funktioniert, aber leider gab’s beim Kompilieren folgenden Fehler:
FileDownload.java:66: warning: [deprecation] readLine() in java.io.DataInputStream has been deprecated
while ( (receivedData = dis.readLine()) != null ) {
^
1 warning
Was kann ich da machen?
Gruß comfreak
PS: Der Pfeil war beim Punkt von “dis.readLine()”
Von comfreak • Freitag, 07. August 2009, 12:22 UhrWas kann ich da machen?
Entweder dieselbe, sieben Jahre alte Java Version, welche ich benutze, installieren (1.4.2) und mit entsprechenden Deprecation Einstellungen kompilieren, oder gegen ein passendes Pendant aus aktuelleren Java Versionen austauschen (z.B. BufferedReader, weil man da auch schön Zeile für Zeile lesen kann).
class FileDownload {
public static void main(String[] args) throws java.io.IOException {
java.io.BufferedReader br = new java.io.BufferedReader(new java.io.InputStreamReader(new java.net.URL(args[0]).openStream()));
String receivedData;
while ( (receivedData = br.readLine()) != null ) { System.out.println(receivedData); }
}
}
^^ in etwa so (sieht nach wenig aus, ist aber eine Vollständige Applikation).
Allegra Leser! Nur angemeldete Nutzer können bei diesem Beitrag Antworten hinterlassen. Jetzt kostenlos registrieren oder mit bestehendem Benutzerprofil anmelden.
Ab CHF 5.– im Monat
👉🏼 Wir benötigen deine Unterstützung! Unterstütze macprime mit einem freiwilligen Gönner-Abo und mache die Zukunft unseres unabhängigen Apple-Mediums aus der Schweiz mit möglich.
macprime unterstützen
macprime ForumXcode: Netzwerkschnittstellen auslesen und einzeln ansprechen
hirnstroem
comfreak
hirnstroem
sierra2
comfreak
comfreak
comfreak
hirnstroem
Anmelden um neue Antworten zu verfassen
Allegra Leser! Nur angemeldete Nutzer können bei diesem Beitrag Antworten hinterlassen. Jetzt kostenlos registrieren oder mit bestehendem Benutzerprofil anmelden.