# Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP



## noch_anfänger (13. Apr 2010)

Hallo,

ich beabsichtige eine Benutzeroberfläche zu einem Software zu implementieren. Das Sofware läuft in PHP und erlaubt benutzerdefinierte Anwendungen zu entwickeln. Datenaustausch muss über SOAP gehen.

Alles notwendiges ist schon in PHP gemacht: angeschlossene Geräte werden angesprochen, IDs eingelesen, Boolean Variablen gesetz. Nun will ich die in PHP gewonnene Information (IDs und Werte von Boolean Variablen) an die Java-GUI übergeben. Es geht wirklich nur darum, diese Daten dem Benutzer anzuzeigen.

Im Internet (und in diesem Forum) habe ich etwas gefunden. Da ich aber noch keine Server-Client Anwendungen programmiert habe, bin ich nicht sicher, wie alles zu organisieren. Ich bitte euch um die Korrektur, wenn ich mich irre:

1. Mein PHP-Software ist Server, dafür gibt es eine PHP-Erweiterung php_soap.dll
2. Java-GUI ist Client, dafür JaxB, sollte angeblich im Java6 SDK vorhanden sein
3. Datenaustausch mittels SOAP (mit WSDL oder ohne, weiß ich nicht)

Wenn jemand ein passendes Beispiel oder eine Empfehlung hat, würde ich mich sehr freuen.


----------



## noch_anfänger (13. Apr 2010)

Wie ich gerade ermittelt habe, mein PHP-Software unterstützt eine Reihe von Services, die mit WSDL geschrieben sind.

Die Frage ist, ob die Punkten 1 und 2 im ersten Posting richtig gesetzt sind (und nicht umgekehrt ???:L). Also ob PHP-Software ein Server wäre und Java-GUI ein Client.


----------



## Empire Phoenix (13. Apr 2010)

hm joa warum sollte die gui nicht der Client sein?


----------



## agent47 (13. Apr 2010)

Wenn dir die Windgets von GTK+ ausreichen kannst du doch die PHP-GTK plattform nutzen um eine GUI direkt über PHP an zu sprechen, von der Geschwindigkeit sollte das nicht viel schlechter als eine Java GUI sein da die eigentlichen Windgets in C funktionen gekapselt sind.


----------



## noch_anfänger (13. Apr 2010)

GUI in Java ist eine Anforderung, wie auch vorgegebene PHP-Software. Sorry, hätte das schreiben sollen.

Sind meine Überlegungen bzgl. der Sache, was Server und was Client ist, richtig? An GUI werden nur die Daten übertragen und angezeigt. Es wird keine Steuerung von GUI aus gefordert.

Habe gelesen, dass es für SOAP in Java außer JaxB auch Axis mit Tomcat gibt. Was ist besser (sprich einfacher)????:L Kann vielleicht jemand einen Rat geben?


----------



## Tente (14. Apr 2010)

Grundsätzlich ist das möglich, was du vor hast. 

Die Daten deiner PHP-Anwendung musst du über einen Webservice bereitstellen. Ich hab leider noch keinen Webservice in PHP implementiert, jedoch sollte das nicht all zu schwer sein. Es gibt einige Tutorials im Internet. 

Dazu muss natürlich auch eine WSDL Datei existieren, denn irgendwie müssen die Daten beschrieben werden, die der Webservice bereitstellen kann. Der Datenaustausch kann dann über SOAP Messages vollzogen werden. Seitens Java sollte es keine Probleme beim Ansprechen des Webservices gegeben. Java ist da recht unproblematisch, was das nutzen eines Webservices angeht.

Ich würde es mal so versuchen.

Korrigiert mich, wenn ich mich irre.


----------



## kama (14. Apr 2010)

Hallo,



noch_anfänger hat gesagt.:


> Habe gelesen, dass es für SOAP in Java außer JaxB auch Axis mit Tomcat gibt. Was ist besser (sprich einfacher)????:L Kann vielleicht jemand einen Rat geben?


Den Tomcat brauchst Du nur, wenn die Java Seite (Client?) auch Services anbieten soll...aber wenn ich das hier richtig verstehe benötigst Du "nur" einen SOAP Client, der Daten bei der PHP-Software (Server?) abholt und verarbeitet/anzeigt...etc...

Wenn Du eine WSDL vorliegen hast seines PHP dann kann Du z.B. in Axis den Code erzeugen klassen und dann sehr schnell einen client erzeugen, der deinen PHP-Server anspricht...

Gruß
Karl Heinz Marbaise


----------



## noch_anfänger (20. Apr 2010)

kama hat gesagt.:


> ... benötigst Du "nur" einen SOAP Client, der Daten bei der PHP-Software (Server?) abholt und verarbeitet/anzeigt...etc...



Das ist richtig. Kann man dann Axis ohne Tomcat installieren? Tomcat ist angeblich ein Container für Axis...



kama hat gesagt.:


> Wenn Du eine WSDL vorliegen hast seines PHP dann kann Du z.B. in Axis den Code erzeugen klassen und dann sehr schnell einen client erzeugen, der deinen PHP-Server anspricht...


 Muss der Client immer selbst den Server ansprechen? Ich dachte, dass der Server Meldungen an den Client schickt (meldet sich an), und der Client dann diese Meldungen verarbeitet.


----------



## Murray (20. Apr 2010)

noch_anfänger hat gesagt.:


> Ich dachte, dass der Server Meldungen an den Client schickt (meldet sich an), und der Client dann diese Meldungen verarbeitet.


Umgekehrt - der Client meldet sich beim Server an und ruft dort eine Funktion auf, indem er einen SOAP-Request an den Web-Service schickt. Der Server antwortet mit einem SOAP-Response.


----------



## Gast2 (20. Apr 2010)

noch_anfänger hat gesagt.:


> Das ist richtig. Kann man dann Axis ohne Tomcat installieren? Tomcat ist angeblich ein Container für Axis...



Axis (und du solltest Axis2 nehmen) ist erstmal nichts anderes als eine Sammlung von Libs und Tools die dir bei der Erstellung und Kommunikation von/mit Webservices helfen und viel Arbeit abnehmen.

Man kann natürlich auch eine Serverapplikation mit Axis erstellen - genauso gut wie eine Clientapplikation. Du kannst dir auch mal the Web Service, SOA and SOAP Testing Tool - soapUI ansehen. Ist sehr praktisch wenn man mit SOAP Webservices entwickelt.


----------



## kama (20. Apr 2010)

Hallo,



noch_anfänger hat gesagt.:


> Kann man dann Axis ohne Tomcat installieren?


Warum nicht? Was hat Axis genauer Axis2 mit Tomcat zu tuen? Wenn Du einen Server implementieren willst dann schon, wenn Du dich für Tomcat entscheidest...aber es gibt auch noch andere Möglichkeiten...


noch_anfänger hat gesagt.:


> Tomcat ist angeblich ein Container für Axis...


Also mal ganz klar wo steht das? Es kann in so weit ein Container sein, wenn ein Server implementiert wird aber bei einem Client ?

Ich empfehle Apache Axis2 -



noch_anfänger hat gesagt.:


> Muss der Client immer selbst den Server ansprechen? Ich dachte, dass der Server Meldungen an den Client schickt (meldet sich an), und der Client dann diese Meldungen verarbeitet.


Der Server schickt nichts von sich aus...sondern der 1. Schritt ist der Client meldet sich an am Server und mach dann eine Anfrage an den Server (z.B. Gibt mir bitte die Daten XYZ)...und der Server antwortet dann....

Gruß
Karl Heinz Marbaise


----------



## noch_anfänger (20. Apr 2010)

Danke für die Hinweise und Empfelungen!

ich war eilig und habe schon Tomcat mit Axis installiert...
Und habe schon die Fehlermeldungen bekommen...


```
org.xml.sax.SAXException: Bad envelope tag:  definitions
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXException: Bad envelope tag:  definitions
 faultActor: 
 faultNode: 
 faultDetail: 
	{http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: Bad envelope tag:  definitions
	at org.apache.axis.message.EnvelopeBuilder.startElement(EnvelopeBuilder.java:71)
	at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
	at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
	at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
	at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
	at org.apache.axis.client.Call.invoke(Call.java:2767)
	at org.apache.axis.client.Call.invoke(Call.java:2443)
	at org.apache.axis.client.Call.invoke(Call.java:2366)
	at org.apache.axis.client.Call.invoke(Call.java:1812)
	at soap.ClientTest.main(ClientTest.java:22)

	{http://xml.apache.org/axis/}hostname:student-4

org.xml.sax.SAXException: Bad envelope tag:  definitions
	at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
	at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:701)
	at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
	at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
	at org.apache.axis.client.Call.invoke(Call.java:2767)
	at org.apache.axis.client.Call.invoke(Call.java:2443)
	at org.apache.axis.client.Call.invoke(Call.java:2366)
	at org.apache.axis.client.Call.invoke(Call.java:1812)
	at soap.ClientTest.main(ClientTest.java:22)
Caused by: org.xml.sax.SAXException: Bad envelope tag:  definitions
	at org.apache.axis.message.EnvelopeBuilder.startElement(EnvelopeBuilder.java:71)
	at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at javax.xml.parsers.SAXParser.parse(Unknown Source)
	at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
	at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
	... 9 more
```

Was ist denn falsch bei mir????:L

Hier ist die Clientklasse:

```
import org.apache.axis.client.Call;  
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;

public class ClientTest {
    public static void main(String[] args)
          {
              try
             {
                 String endpoint = "http://127.0.0.1:3773/wsdl/IIPSSimpleKernel";
        	 
                 Service service = new Service();
                 Call call = (Call) service.createCall();
   
                 call.setTargetEndpointAddress( new java.net.URL(endpoint) );
                 call.setOperationName("GetKernelTicktime");
                 
                 Integer ret = (Integer) call.invoke( new Object[] {} );
                 System.out.println("ServerTime: " + ret);
             }
             catch (Exception e)
             {
                System.err.println(e.toString());
                e.printStackTrace();
             }
             System.exit(0);
         }
}
```


----------



## Gast2 (20. Apr 2010)

Wie du hast Tomcat installiert? Wofür? Als SOAP Server? Oder läuft in dem Tomcat deine Clientapplication?

Importier mal http://127.0.0.1:3773/wsdl/IIPSSimpleKernel in SOAPUI und schick einen Testrequest ab.

[c]Bad envelope tag:  definitions[/c] sieht aus als wenn deine SOAP Envelope um die XML Nachricht nicht korrekt ist. Lass dir doch mal irgendwo auf System.out oder in einen Logger die XML Message schreiben die verschickt wird.


----------



## noch_anfänger (20. Apr 2010)

Tomcat habe ich installiert, da ich gelesen habe - man braucht Tomcat mit Axis für SOAP-Umtausch zwischen PHP und Java. Ich habe schon verstanden, dass Tomcat nötig ist, wenn man eigene Services erstellt. Das brauche ich momentan nicht, vielleicht später. Meine Clientapplikation läuft im Tomcat nicht.
Ich verwende eine Software - IP-Symcon - die in PHP läuft und eine Menge an Services mit WSDL anbietet. Das soll eigentlich mein SOAP-Server sein. 
Die erste Zeile der WSDL vom benötigten Service sieht so aus:
[XML]<definitions name="IIPSSimpleKernelservice" targetNamespace="http://localhost/">[/XML]
D.h. 
	
	
	
	





```
String endpoint = "http://localhost/IIPSSimpleKernelservice";
```
 ist richtig. Oder?

Das führt aber zu dem Fehler:

```
java.net.SocketException: Connection reset
AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: java.net.SocketException: Connection reset
 faultActor: 
 faultNode: 
 faultDetail: 
	{http://xml.apache.org/axis/}stackTrace:java.net.SocketException: Connection reset............
```

In der vorgegebenen Software läuft die Abfrage von Services gut mit 
	
	
	
	





```
$client1 = new SoapClient("http://127.0.0.1:3773/wsdl/IIPSSimpleKernel");
       print($client1->GetKernelTicktime());
```



> Importier mal http://127.0.0.1:3773/wsdl/IIPSSimpleKernel in SOAPUI


  das verstehe ich nicht. Was ist SOAPUI?

P.S. Axis gibt zwei Services als Beispiele auf dem localhost: Version und AdminService, jeweils mit einer Funktion. Ich habe beide in meiner Testklasse ausprobiert. Nur getVersion funktioniert.


----------



## Gast2 (20. Apr 2010)

SOAPUI hatte ich in meinem letzten Beitrag verlinkt. Das ist eine SOAP Client. Da gibst du die WSDL an und dann wird dir automatisch alles was du brauchst um einen Samplerequest zu schicken generiert. Damit kannst du interaktiv schon mal deinen Server testen.

Du musst halt mindestens einmal die WSDL importieren und dir daraus die entsprechenden Clientklassen generieren lassen. Meistens stellen die SOAPServer die WSDL so bereit:

some.server.com


----------



## noch_anfänger (20. Apr 2010)

Danke fassy,

ich habe SOAPUI installiert und ein Paar requests an meinen SOAP-Server geschickt. Es funktioniert! Im Editor habe ich auch die richtige Adresse für endpoint gefunden 
	
	
	
	





```
http://localhost:3773/soap/IIPSVariableManager
```

Nun habe ich die nächste Frage.

```
call.setOperationName("GetVariableID(12345)");
```
 verursacht einen Fehler. 
Die Funktion beim Service ist beschrieben wie folgt:

```
string 	ReadVariableString(unsignedShort VariableID)
```
Wo und wie soll man die VariableID schreiben?


----------



## noch_anfänger (20. Apr 2010)

Irgendwie muss man mit addParameter(...) machen.


----------



## noch_anfänger (20. Apr 2010)

Jetzt sieht meine Klasse so aus:

```
package soap;

import org.apache.axis.client.Call;  
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.Constants;

public class ClientTest {
    public static void main(String[] args)
          {
              try
             {        
                 String endpoint = "http://localhost:3773/soap/IIPSVariableManager";
                 Service service = new Service();
                 Call call = (Call) service.createCall();
                 call.setTargetEndpointAddress( new java.net.URL(endpoint) );
                 call.setOperationName("GetVariableID");
                 call.addParameter("VariableName", Constants.XSD_ANY , ParameterMode.IN);
                 call.addParameter("VariableID", Constants.XSD_UNSIGNEDSHORT , ParameterMode.OUT);
                 call.setReturnType(Constants.XSD_UNSIGNEDSHORT);
                
                 String result = call.invoke(new Object[]{"input0"}).toString();    // VariableName = "input0"
                 System.out.println(result);     
             }
             catch (Exception e)
             {
                System.err.println(e.toString());
                e.printStackTrace();
             }
             System.exit(0);
         }
}
```

Und die Fehlermeldung ist :

```
Variable mit Namen "" existiert nicht
AxisFault
......
```

Denke ich in die falsche Richtung mit addParameter?
Ich muss irgendwie Parameter in GetVariableID einpacken...


----------



## noch_anfänger (20. Apr 2010)

Hi Leute,

es funktioniert! Nachdem ich schon die Hoffnung verloren habe, habe ich selbst den Fehler gefunden.
Statt 
	
	
	
	





```
call.addParameter("VariableName", Constants.XSD_ANY , ParameterMode.IN);
```
soll

```
call.addParameter("VarName", Constants.XSD_ANY , ParameterMode.IN);
```
SOAPUI hat wieder geholfen.


----------



## Gast2 (21. Apr 2010)

Sorry, hatte den Thread aus den Augen verloren...

Ist ja schön das es jetzt geht. SOAPUI ist wirklich ein extrem gutes Tool wenn man mit Webservices rumbastelt. Hat mich auch schon so mancher Problemlösung näher gebracht.


----------

