Oortael Geschrieben 27. Juli 2004 Geschrieben 27. Juli 2004 Hi, mein Programm soll sich mit Sockets zum Port 80 auf einer anderen Maschine connecten, und dort einen Stream lesen und in einen String packen. Das dauert aber elendig lang, kann man das irgenwie beschleunigen? Dazu mein Code: package socket.domain; import java.io.*; import java.net.*; public class Time { public Time(){}; /* * Gibt einen String mit der aktuellen Zeit zurück. * */ public String printTime(String ip, int port) { //Methoden Variablen deklarieren und initialisieren int i = 0; String s = null; StringBuffer sBuf = null; Socket sock1 = null; try { //Verbindung aufbauen InetAddress inet = InetAddress.getByName(ip); System.out.print("Host: "+ip); System.out.println("Connecting..."); sock1 = new Socket(inet, port); System.out.println("Connection available?\t"+sock1.isConnected()); InputStream ioStream = sock1.getInputStream(); System.out.println("ioStream angelegt"); byte[] b = new byte[100]; sBuf = new StringBuffer(); while ((i = ioStream.read() != -1) { sBuf.append(i); System.out.println("i appended."); } s = sBuf.toString(); ioStream.close(); sock1.close(); System.out.println("*** Socket closed. ***"); } catch (IOException e) { e.printStackTrace(); } return s; } public static void main(String[] args) { Time t = new Time(); String s = t.printTime("192.168.0.1", 80); System.out.println(s); } } [/code] Danke für eure Mühe. Schönen Abend noch. Codefiesler Zitieren
Peeter Geschrieben 28. Juli 2004 Geschrieben 28. Juli 2004 Ja, ich weiß was so lange dauert... InetAddress inet = InetAddress.getByName(ip); ... deine Namensauflösung. Übergib lieber die IP direkt an dein Socket (da deine IP eh ein String ist). sock1 = new Socket(ip, port); Zitieren
Oortael Geschrieben 28. Juli 2004 Autor Geschrieben 28. Juli 2004 Habs ausprobiert, geht aber trotzdem nicht schneller. Das Connecten ist gleich passiert, aber der rest dauert unendlich lang. Zitieren
Peeter Geschrieben 29. Juli 2004 Geschrieben 29. Juli 2004 Versuch mal dein byte[100] etwas größer zu machen. Ich probier den Code bei mir mal aus.... Zitieren
Peeter Geschrieben 29. Juli 2004 Geschrieben 29. Juli 2004 JETZT weiß ich woran das liegt.... :beagolisc Also folgendes. Dein Programm passt soweit... Nur gibt es ein Problem. Der Webserver antwortet ja erst wenn der Client eine Anfrage schickt. Da du aber nichts durch deinen OutputStream jagst, reagiert der Webserver auch auf nichts... Verstehst du? Du bist zwar mit dem Webserver verbunden, jedoch gibt's dann irgendwann einen Timeout, weil nichts passiert... Nimm mal einen anderen Port um sowas zu testen, oder schicke eine "Anfrage" an den Webserver. Zitieren
Oortael Geschrieben 29. Juli 2004 Autor Geschrieben 29. Juli 2004 Reicht es, wenn ich dann vor dem InputStream, diesen Code schreibe, OutputStream out = sock1.getOutputStream(); byte[] byteWrite = {0001}; out.write(byteWrite); oder muss ich ein bestimmtes Pattern einhalten? Mein Code sieht dann so aus: package socket.domain; import java.io.*; import java.net.InetAddress; import java.net.Socket; public class Time { public Time(){}; /* * Gibt einen String mit der aktuellen Zeit zurück. * */ public String printTime(String ip, int port) { //Methoden Variablen deklarieren und initialisieren int i = 0; String s = null; StringBuffer sBuf = null; Socket sock1 = null; try { //Verbindung aufbauen InetAddress inet = InetAddress.getByName(ip); System.out.print("Host: "+ip); System.out.println("Connecting..."); sock1 = new Socket(inet, port); System.out.println("Connection available?\t"+sock1.isConnected()); //Informationen vom Zeitserver holen //InputStreamReader ioStream = new InputStreamReader(sock1.getInputStream()); //Request schicken OutputStream out = sock1.getOutputStream(); byte[] byteWrite = {0001}; out.write(byteWrite); System.out.println("Bytes written."); //Zeit vom Server in Stream laden InputStream ioStream = sock1.getInputStream(); System.out.println("ioStream angelegt"); //zu lesende anzahl festlegen byte[] b = new byte[100]; //solang lesen bis stream keine daten mehr enthält sBuf = new StringBuffer(); while ((i = ioStream.read() != -1) { sBuf.append(i); System.out.println("i appended."); } s = sBuf.toString(); ioStream.close(); sock1.close(); System.out.println("*** Socket closed. ***"); } catch (IOException e) { e.printStackTrace(); } return s; } public static void main(String[] args) { Time t = new Time(); String s = t.printTime("192.168.0.1", 80); System.out.println(s); } } [/code] Zitieren
Peeter Geschrieben 30. Juli 2004 Geschrieben 30. Juli 2004 Naja, du müsstest schon mindestens HTTP 1.0 einhalten, sonst gibt dein Webserver nur Quatsch zurück.... Schreib sowas wie "GET irgendwo/irgendwas" in den Stream und der Webserver gibt dir die entsprechende Seite zurück.... Zitieren
etreu Geschrieben 30. Juli 2004 Geschrieben 30. Juli 2004 GET /pfad/zu/deiner.datei HTTP/1.1\r\n Host: Hostname\r\n \r\n Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.