Hallo alle miteinander,
ich habe mich einmal an eine XML-RPC Client-Server Verbindung gesetzt.
Anbei der Code:
Server
package my.xmlrpcServer;
import org.apache.xmlrpc.server.\*;
import org.apache.xmlrpc.webserver.WebServer;
public class Server {
//the port to run on
private static final int port = 8080;
private static WebServer webServer;
public static void main(String[] args) throws Exception {
webServer = new WebServer(port);
//xml rpc server aus webserver kreieren
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
//Handling für die rpc object calls
PropertyHandlerMapping phm = new PropertyHandlerMapping();
//calls korrek verstanden: wenn calc reinkommt wird die klasse Calc aufgerufen.
phm.addHandler("calc", my.xmlrpcServer.Calc.class);
phm.addHandler("stopServer", my.xmlrpcServer.Server.class);
//propertyhandler auf xml server draufhauen
xmlRpcServer.setHandlerMapping(phm);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
System.out.println("starting webserver");
webServer.start();
}//main
public boolean end() {
webServer.shutdown();
System.out.println("stopping webserver");
return Boolean.TRUE;
}
}//class
Dazu die Calc-Klasse
package my.xmlrpcServer;
public class Calc {
public Calc() {
}
public int add(int i, int j) {
System.out.println("called add");
return i+j;
}
}
Und mein Client dazu:
package my.XMLRPCClient;
import java.net.URL;
import java.util.Vector;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.apache.xmlrpc.client.XmlRpcCommonsTransportFactory;
public class Client {
public static void main(String[] args) throws Exception {
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL("http://127.0.0.1:8080/xmlrpc"));
config.setEnabledForExceptions(true);
config.setConnectionTimeout(60\*100);
config.setReplyTimeout(60 \* 1000);
XmlRpcClient client = new XmlRpcClient();
client.setTransportFactory(new XmlRpcCommonsTransportFactory(client));
client.setConfig(config);
Object[] params = new Object[] { new Integer(2), new Integer(3) };
Integer result = (Integer) client.execute("calc.add", params);
System.out.println("2 + 3 = " + result);
client.execute("stopServer.end",new Vector());
}//main
}//class
Nun zu meinen Fragen:
Ist es normal, dass sich keine Handler auf Funktionen ohne return-Wert bilden lassen? Ohne das boolean im Return liefert die Funktion vom Server end() immer einen Java Fehler.
Dazu finde ich es auch etwas befremdlich, dass ich „einfach irgendwas“ beim client.execute() als zweiten Paramter für eine Funktion ohne Parameter anhängen muss - ist das denn auch so gewollt oder geht es schöner?
Nach etwas gefrickel funktioniert es nun auch, daß der Client den Server beendet. Aber ich habe ein paar unschöne Fehlermeldungen mit denen ich nichts anzufangen weiss:
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server 127.0.0.1 failed to respond
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (org.apache.commons.httpclient.NoHttpResponseException) caught when processing request: The server 127.0.0.1 failed to respond
11.08.2009 11:34:49 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
Exception in thread "main" org.apache.xmlrpc.XmlRpcException: I/O error while communicating with HTTP server: Connection refused: connect
at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:244)
at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:151)
at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:115)
at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:158)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:147)
at my.XMLRPCClient.Client.main(Client.java:31)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:227)
... 7 more
Caused by:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at org.apache.xmlrpc.client.XmlRpcCommonsTransport.writeRequest(XmlRpcCommonsTransport.java:227)
at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:151)
at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:115)
at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:158)
at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:147)
at my.XMLRPCClient.Client.main(Client.java:31)
Weiss jemand wie ich diese wegbekomme? Oder kann mir kurz erklären, was ich da für einen Murks fabriziert habe?
Oder gibt es vielleicht eine schönere Methode den Server abzuschalten?
Besten Dank und viele Grüße
Björn