Einfache Netzwerkfunktionen mit Java

+ andere TechDocs
+ Java I/O
+




Inhalt

  1. IP-Cache
  2. Vereinfachtes Ping
  3. Zeitangabe per Internet
  4. Datei vom Internet per HTTP oder FTP laden
  5. Daten per HTTP-POST-Request senden
  6. In JSP-Anwendungen Daten oder Dateien vom Internet per HTTP, FTP oder SOAP
  7. Externe IP-Adresse bei NAT-Router


IP-Cache

Suns Java-Implementierung cached IP-Adressen. Die Cache-Verweildauer ist normalerweise auf unendlich eingestellt. Soll ein Java-Programm sich ändernde IP-Adressen korrekt erfassen, muss es entweder neu gestartet werden oder die System-Property sun.net.inetaddr.ttl muss anders eingestellt werden:
  -1:      caching forever (default)
  >= 0:  the number of seconds to cache an address for



Vereinfachtes Ping

Ein echtes Ping-Programm ist in Pur-Standard-Java nicht möglich, da ICMP nicht unterstützt wird.
ICMP benötigt SOCK_RAW, die Java-Standardbibliotheken unterstützen aber nur SOCK_STREAM und SOCK_DGRAM.

Echtes Ping kann für bestimmte Betriebssysteme per JNI realisiert werden, siehe z.B. http://www.geocities.com/SiliconValley/Bit/5716/ping/index_eng.html für Windows.

Das hier vorgestellte SimplePing prüft, ob und in welcher Zeit ein Host-Rechner erreichbar ist und ermittelt die IP-Adresse.
host kann als Rechner-Name oder IP-Adresse angegeben werden.
port bestimmt die zu testende Port-Nummer (z.B. 80 für HTTP, 21 für FTP, 23 für TELNET, 25 für SMTP, 110 für POP3, 119 für NNTP und 1099 für RMI).

import java.net.*;

public class SimplePing
{
  public static void main( String[] args )
  {
    System.out.println( "\nUsage: java SimplePing host [port] \n" +
                        " e.g.: java SimplePing www.torsten-horn.de \n" +
                        "   or: java SimplePing 1.2.3.4 80 \n" );
    try {
      if( args.length <= 0 )
        throw new Exception( "Parameter missing!" );
      InetAddress host = InetAddress.getByName( args[0] );
      int         port = ( args.length > 1 ) ? Integer.parseInt( args[1] ) : 80;
      long        tm   = System.nanoTime();
      Socket      so   = new Socket( host, port );
      so.close();
      tm = (System.nanoTime() - tm) / 1000000L;
      System.out.println( "Connection ok (port " + port + ", time = " + tm + " ms). \n" +
                          "Host Address = " + host.getHostAddress() + "\n" +
                          "Host Name    = " + host.getHostName() );
      System.exit( 0 );
    } catch( Exception ex ) {
      System.out.println( "Error: " + ex.getMessage() );
      System.exit( 1 );
    }
  }
}


Zeitangabe per Internet

Es gibt im Internet viele Time Server, welche die genaue Zeit ausgeben können, zum Beispiel die Atomuhr in Braunschweig (ptbtime1.ptb.de):

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeFromInternet
{
   public static void main( String[] args )
   {
      final String           DEFAULT_TIME_SERVER = "ptbtime1.ptb.de";
      final SimpleDateFormat DATUMFORMAT = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
      final long             SEKUNDEN_1900_1970 = 2208988800L;
      Socket                 so = null;
      InputStream            in = null;
      long                   time = 0;
      try {
         so = new Socket( ( args.length > 0 ) ? args[0] : DEFAULT_TIME_SERVER, 37 );
         in = so.getInputStream();
         for( int i = 3; i >= 0; i-- ) {
            time ^= (long) in.read() << i * 8;
         }
         // Der Time Server gibt die Sekunden seit 1900 aus, Java erwartet Millisekunden seit 1970:
         System.out.println( DATUMFORMAT.format( new Date( (time - SEKUNDEN_1900_1970) * 1000 ) ) );
      } catch( Exception ex ) {
         System.out.println( ex );
      } finally {
         if( in != null ) try { in.close(); } catch( IOException ex ) {/*ok*/}
         if( so != null ) try { so.close(); } catch( IOException ex ) {/*ok*/}
      }
   }
}


Datei vom Internet per HTTP oder FTP laden

import java.io.*;
import java.net.URL;

public class FileFromUrl
{
   public static void main( String[] args )
   {
     if( 2 != args.length ) {
       System.out.println( "\nLoad file from Internet (any file, text as well as binary).\n" +
                           "Usage: java FileFromUrl url file \n" +
                           " e.g.: java FileFromUrl http://www.torsten-horn.de x.htm \n" +
                           "   or: java FileFromUrl ftp://ftp.gnu.org/README   x.txt \n" );
       System.exit( 1 );
     }
     System.out.println( "\nURL:\n" + args[0] );
     long         tm = 0;
     int          len1, len2 = 0;
     InputStream  is = null;
     OutputStream os = null;
     try {
       URL url = new URL( args[0] );
       is = url.openStream();
       os = new FileOutputStream( args[1] );
       byte[] buff = new byte[4096];
       tm = System.nanoTime();
       while( -1 != (len1 = is.read( buff )) ) {
         os.write( buff, 0, len1 );
         len2 += len1;
       }
       tm = (System.nanoTime() - tm) / 1000000L;
       os.flush();
     } catch( Exception ex ) {
       System.out.println( "\nError: " + ex );
     } finally {
       if( os != null ) try { os.close(); } catch( IOException ex ) {/*ok*/}
       if( is != null ) try { is.close(); } catch( IOException ex ) {/*ok*/}
     }
     System.out.print( "written to file:\n" + args[1] + "\n(" + len2 + " Bytes in " + tm + " ms" );
     System.out.println( (( 1000 < tm ) ? (" = " + ((10*len2+tm/2)/tm)/10. + " KByte/sec") : "") + ")." );
   }
}

Wesentlich ausführlichere Programmierbeispiele zu FTP finden Sie unter java-ftp.htm.

Daten per HTTP-POST-Request senden

HTTP-GET-Requests sind der Default (wie obiges Programmierbeispiel 'FileFromUrl' zeigt). Dazu genügt der einfache Aufruf einer URL. Parameter können durch '?' von der URL abgetrennt und untereinander durch '&' getrennt angehängt werden (z.B. "http://www.domain.tld?parm1=val1&parm2=val2").

HTTP-POST-Requests sind etwas aufwändiger zu programmieren, wie dieses Programmierbeispiel 'PostToUrl' zeigt. Eventuell müssen Sie zusätzlich auch Encodings berücksichtigen.

Wenn Sie es wesentlich einfacher und komfortabler haben wollen: Sehen Sie sich RESTful Web Services mit JAX-RS und Jersey an.
Falls Sie das dort beschriebene Bücherverwaltung-Programmierbeispiel starten, können Sie 'PostToUrl' zum Beispiel testen über:

java PostToUrl http://localhost:8080/REST/ws/Artikel/Buecher "isbn=9876543213&titel=PostToUrl-Titel&preis=333"

start http://localhost:8080/REST/ws/Artikel/Buecher


import java.io.*;
import java.net.*;

public class PostToUrl
{
   public static void main( String[] args )
   {
      if( 2 != args.length ) {
         System.out.println( "\nSend data per HTTP POST Request.\n" +
                             "Usage: java PostToUrl url \"parm1=val1&parm2=val2\" \n" );
         System.exit( 1 );
      }
      System.out.println( "\nURL:  " + args[0] );
      System.out.println( "Data: " + args[1] );
      System.out.println( "Response:" );

      OutputStream os = null;
      InputStream  is = null;

      try {
         // Connection:
         URL           url = new URL( args[0] );
         URLConnection con = url.openConnection();
         if( !(con instanceof HttpURLConnection) )
            throw new Exception( "Error: Only HTTP allowed." );
         ((HttpURLConnection) con).setRequestMethod( "POST" );
         con.setDoOutput( true );
         // Send data:
         os = con.getOutputStream();
         os.write( args[1].getBytes() );
         os.flush();
         // Read response:
         is = con.getInputStream();
         int len;
         byte[] buff = new byte[4096];
         while( -1 != (len = is.read( buff )) ) {
            System.out.print( new String( buff, 0, len ) );
         }
         System.out.println();
       } catch( Exception ex ) {
         System.out.println( "\nError: " + ex );
       } finally {
         if( os != null ) try { os.close(); } catch( IOException ex ) {/*ok*/}
         if( is != null ) try { is.close(); } catch( IOException ex ) {/*ok*/}
       }
   }
}


In JSP-Anwendungen Daten oder Dateien vom Internet per HTTP, FTP oder SOAP

Unter "jsp-taglibs.htm#ErsteTestanwendungApacheJakartaTaglibs" finden Sie eine einfache JSP-Anwendung, die Dateien vom Internet per HTTP, FTP oder SOAP per JSP Apache Jakarta Taglib "taglibs-io" lädt.



Externe IP-Adresse bei NAT-Router

Unter "http://checkip.dyndns.org" können Sie Ihre externe im Internet sichtbare IP-Adresse ermitteln. Diese ist anders als die lokale IP-Adresse Ihres Rechners, wenn Sie über einen NAT-Router ans Internet gekoppelt sind.

Ihre lokale IP-Adresse können Sie unter Windows XP mit 'ipconfig /all' und unter Linux mit 'ifconfig' ermitteln.






Weitere Themen: andere TechDocs | Java I/O
© 1998-2007 Torsten Horn, Aachen