Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Ankündigungen, News und Feedback > Tutorials > [JAVA] Wie man aus Java mit einem PHP-Script kommuniziert
Antwort
 
Themen-Optionen
Alt 25.03.2006, 22:24   Nach oben    #1
sparrow
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard [JAVA] Wie man aus Java mit einem PHP-Script kommuniziert

Warum sollte ein Java Programm mit einem PHP-Script kommunizieren können?
Java ist bekanntlich bestens dafür geeignet Webanwendungen, sogenannte Applets, zu schreiben. Diese Applets werden innerhalb des Browserfensters ausgeführt und laufen innerhalb der JVM (Java-Virtuellen-Maschine).
Dies bedeutet auch, dass die Daten des Applets von der Webseite heruntergeladen und lokal auf dem Rechner ausgeführt werden, völlig getrennt von dem Server von dem sie stammen.
Die meisten Webspace-Anbieter bieten heute bereits Datenbanken mit ihren Paketen an. Dummerweise nützen die für Applets in den meisten Fällen gar nichts. Da das Applet auf dem lokalen Computer ausgeführt wird müßte das Applet auf die Datenbank des Servers verbinden können. In der Regel wird das durch den Anbieter aus Sicherheitsgründen aus gutem Grund nicht erlaubt und technisch unterbunden.
In solchen Fällen bietet der Anbieter mit Sicherheit PHP in seinem Paket an. PHP wird im Gegensatz zu Java auf dem Server interpretiert und ausgeführt. Eine Verbindung von "Außen" zur Datenbank ist also nicht nötig da das PHP-Script auf dem Server läuft ist es nur eine lokale Verbindung.
Java kommt als moderne Programmiersprache mit allen Voraussetzungen daher die man braucht um mit einer Webseite zu kommunizieren. Warum sollte man diese Möglichkeit nicht nutzen um doch an die Datenbank des Anbieters zu gelangen um zum Beispiel die Highscore eines Spiels zu speichern?


Der Ansatz
Damit die Java<->PHP Schnittstelle funktioniert muss auf der PHP-Seite natürlich ein entsprechendes Script verfügbar sein. Das soll aber nicht Thema dieses Tutorials sein.
Auf der Java-Seite der Schnittstelle muss es natürlich die Möglichkeit geben mit einer Webseite zu Kommunizieren.
Dafür stellt Java die Klasse java.net.URLConnection bereit. Eine Instanz dieser Klasse verschafft man sich sehr leicht über ein Objekt der Klasse java.net.URL mit der Methode openConnection().
Ein kleiner Beispielcode:
java Code:
  1. java.net.URL url = new java.net.URL("http://localhost/test.html");
  2. java.net.URLConnection urlcon = url.openConnection();

Lesen und schreiben
java.net.URLConnection stellt die beiden Methoden getInputStream() und getOutputStream() zur Verfügung. Mit ihrer Hilfe erhählt man eine Instanz der entsprechenden Streams und kann diese lesen bzw. darauf schreiben.
Hierbei ist aber unbedingt zu beachten, dass der Verbindung erst explizit erlaubt werden muss Daten zu versenden. Dies geschieht mit der Methode java.net.URLConnection.setDoOutput(boolean). Vorher ist zwar das lesen eingehender Daten über den InputStream möglich, nicht jedoch das senden von Daten über den OutputStream. Diese Daten kommen dann via "POST" im PHP-Script an.
Das senden der Daten über den OutputStream sollte als String erfolgen, und zwar so wie man es von Daten versendet die via Post übermittelt werden, also in dem folgenden Format:
Code:
keyname1=value1&keyname2=value2&keyname3[....]
Über den InputStream kommen die Daten "rein" die das PHP-Script ausgibt, in der Regel durch den Befehl "echo".
Somit hier also eine erweiterung unseres obrigen Beispielcodes:
java Code:
  1. java.net.URL url = new java.net.URL("http://localhost/test.html");
  2. java.net.URLConnection urlcon = url.openConnection();
  3. java.io.OutputStream out = urlcon.getOutputStream();
  4. java.io.InputStream in = urlcon.getInputStream();
  5. urlcon.setDoOutput(true);

Besonderheiten
Es liegt in der Natur von Internetseiten, dass sie in einem statischen Zustand vom Server an den Client ausgeliefert werden. Das gilt auch für Webseiten die mit PHP generiert werden. Das was von dem Java-Programm empfangen wird ist das was normalerweise auch als Webseite ausgeliefert wird. Es macht also Sinn erst Daten zu senden und anschließen Daten zu empfangen. Somit hat das PHP-Script Zeit auf die eingehenden Daten zu reagieren.
Beispiel: Java fragt: Die 10 besten Scores für Spiel sowieso, das PHP-Script antwortet mit den entsprechenden Daten.
Die Verbindung unterscheidet sich also von einer Verbindung über Sockets.

Ist der Seitenname nicht korrekt funktioniert zwar das Senden der Daten (wobei die dann wahrscheinlich ins Datennirvana flattern), das Lesen der Daten schlägt aber mit einer java.io.FileNotFoundException fehl.


Beispiel:


So, und hier das ganze Mal praktisch angewand.
Zuerst mal ein PHP-Script für den Server, es tut nichts weiter als die empfangen Daten direkt wieder mit echo auszugeben.
Das Script stammt von Ben und ist leicht abgewandelt:
PHP-Code:
<?php

    
if(strtolower($_SERVER['REQUEST_METHOD']) == 'post') {
        foreach(
$_POST as $key => $value) {
            echo 
'key:' $key '=' $value ' ';
        }
    } 

?>
Hier eine Java-Klasse die alle Schreib- und Lesevorgänge mit dem Script regelt:
java Code:
  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.URL;
  5. import java.net.URLConnection;
  6.  
  7. /**
  8. * PhpPostConnect.java
  9. * This class can represant a connection to an PHP-Site
  10. * to send the side data via "POST" and get Data from
  11. * the side which will be written by side with "echo"
  12. * @author sparrow
  13. */
  14. public class PhpPostConnect {
  15.    
  16.     /** Contains the URL to the PHP-Script */
  17.     private URL sitepath;
  18.     /** The Connection to the URL */
  19.     private URLConnection con;
  20.    
  21.     /**
  22.      * Empty construct, you must set the URL of the
  23.      * target before you start to send and read data
  24.      */
  25.     public PhpPostConnect() {
  26.        
  27.     }
  28.    
  29.     /**
  30.      * Construct which also define the targed URL
  31.      * @param sitepath The URL to the target PHP-Script
  32.      */
  33.     public PhpPostConnect(URL sitepath) {
  34.         this.sitepath = sitepath;
  35.     }
  36.    
  37.     /**
  38.      * Set the URL to the target PHP-Script
  39.      * @param sitepath The URL to the target PHP-Script
  40.      */
  41.     public void setSitePath(URL sitepath) {
  42.         this.sitepath = sitepath;
  43.     }
  44.    
  45.     /**
  46.      * To get the target-URL
  47.      * @return The URL to the target PHP-Script
  48.      */
  49.     public URL getSitePath() {
  50.         return this.sitepath;
  51.     }
  52.    
  53.     /**
  54.      * Sending data to the target-URL
  55.      * @param data The data which should be send
  56.      * @throws IOException
  57.      */
  58.     public void send(String data) throws IOException {
  59.         if (con == null) {
  60.             con = sitepath.openConnection();
  61.         }
  62.         if (con.getDoOutput() == false) {
  63.             con.setDoOutput(true);
  64.         }
  65.         OutputStream out = con.getOutputStream();
  66.         out.write(data.getBytes());
  67.         out.flush();
  68.     }
  69.    
  70.     /**
  71.      * Reading incoming data from the target-URL
  72.      * @return The incoming data
  73.      * @throws IOException
  74.      */
  75.     public String read() throws IOException {
  76.         if (con == null) {
  77.             con = sitepath.openConnection();
  78.         }
  79.         InputStream in = con.getInputStream();
  80.         int c = 0;
  81.         StringBuffer incoming = new StringBuffer();
  82.         while (c >= 0) {
  83.             c = in.read();
  84.             incoming.append((char) c);
  85.         }
  86.         return incoming.toString();
  87.     }
  88.  
  89. }

Und zuletzt die Klasse mit der wir den Test starten.
Wir gehen davon aus, dass das Script unter der URL http://localhost/contest.php erreichbar ist.
Hier wird die Schnittstelle zum PHP-Script instanziert, Testdaten gesendet und das Ergebnis empfangen:
java Code:
  1. import java.io.IOException;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4.  
  5. public class Test {
  6.  
  7.     public static void main(String&#91;&#93; args) {
  8.         try {
  9.             URL url = new URL("http://localhost/contest.php");
  10.             PhpPostConnect con = new PhpPostConnect(url);
  11.             try {
  12.                 con.send("foo1=bar&foo2=bar2");
  13.                 System.out.println(con.read());
  14.             } catch (IOException e) {
  15.                 e.printStackTrace();
  16.             }
  17.         } catch (MalformedURLException e) {
  18.             e.printStackTrace();
  19.         }
  20.     }
  21.  
  22. }

Wenn alles klappt ist folgendes in der Konsole abzulesen:
Code:
key:foo1=bar key:foo2=bar2
Was beweist: wir haben erfolgreich Daten an das PHP-Script versand und anschließend wieder empfangen.
Zur Klarstellung: Wir empfangen die Daten auch wieder im Java-Programm. Das PHP-Script gibt sie nicht in einem Browser aus. Das Java-Programm empfängt die Daten des Scripts wie sie sonst von einem Browser empfangen werden würden.





Sollten Fragen oder Ungklarheiten betreffen des Tutorials bestehen, postet bitte in dem entsprechendem Forum. Danke.


Dieser Beitrag steht unter einer Creative Commons License
(cc) sparrow (at) developers-guide.net -> German PHP and Java Support-Forum

Geändert von Jann Hendrik (03.07.2008 um 10:41 Uhr). Grund: link angepasst
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Java Applet soll Daten an ein PHP Script senden flanger Allgemeine Java-Programmierung 5 16.05.2007 16:52
PHP Script alle x Sekunden ausführen | .bat Script? dsxs Sonstige Programmiersprachen 2 03.08.2006 12:15
Java Script Hilfe!!! (Platzierung eines Link) Gamesagent JavaScript und AJAX 3 08.01.2006 04:54
Java Script & Java manuel Allgemeine Java-Programmierung 8 21.12.2005 19:58
[BUCH] Java ist auch eine Insel kampet Literatur 5 22.02.2005 14:40


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:54 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44