#java #server #client #xml-rpc
#java #сервер #клиент #xml-rpc
Вопрос:
Я знаю, что этот вопрос уже задавался.В ранее задаваемых вопросах есть ссылка, по которой мы можем найти подробную информацию об org.apache.xmlrpc, но я не могу определить альтернативу для метода AddHandler класса WebServer.
У меня есть два проекта
1 Server
Server project consist of
1.1 AreaServer
1.2 AreaHandler
2 Client
Client project consist of
2.1 Client
Класс AreaHandler изменяет площадь окружности для заданного радиуса.
AreaServer использует класс AreaHandler.
AreaServer
package webtutorial;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.xmlrpc.webserver.WebServer;
/**
*
* @author Dev Parzival
*/
public class AreaServer {
public static void main(String $[]){
try {
startServer($);
} catch (IOException ex) {
Logger.getLogger(AreaServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void startServer(String $[]) throws IOException{
WebServer server;
server=new WebServer(Integer.parseInt($[0]));
server.addHandler("area",new AreaHandler());
server.start();
}
}
AreaHandler
package webtutorial;
/**
*
* @author Dev Parzival
*/
public class AreaHandler {
/**
*
* @param radius radius of circle whose area has to be computed
* @return area of the circle whose type is double
*/
public double circleArea(double radius){
return Math.PI*radius*radius;
}
}
Клиент
package client;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
/**
*
* @author Dev Parzival
* @date 02-Sep-2020
* @time 08:46:01
*/
public class Client {
/**
* @param $ the command line arguments , represent the radius of the circle whose area is to be computer via the server.
*/
public static void main(String[] $) {
// TODO code application logic here
Client client=new Client();
double radius=Double.parseDouble($[0]);
try{
double area=client.areaCircle(radius);
System.out.println("Area of the circle is : " area);
}
catch(Exception ex){
System.out.println(ex);
}
}
public double areaCircle(double radius) throws IOException,XmlRpcException{
double area=0;
XmlRpcClient client=new XmlRpcClient();
ArrayList<Double> vec=new ArrayList<Double>();
vec.add(new Double(radius));
Object result=client.execute("area.circleArea", vec);
area=Double.parseDouble(result.toString());
return area;
}
}
Метод AddHandler устарел, поэтому я хочу знать, как это можно сделать
server.addHandler("area",new AreaHandler());
Свяжите класс AreaHandler с area, чтобы при запросе клиента к серверу он возвращал область.
Ответ №1:
Вы все еще можете использовать устаревшие методы. Какую версию xmlrpc вы используете?
В документах указано, что вы можете использовать PropertyHandlerMapping
для добавления сопоставлений из файла свойств.
PropertyHandlerMapping phm = new PropertyHandlerMapping();
/* Load handler definitions from a property file.
* The property file might look like:
* Calculator=org.apache.xmlrpc.demo.Calculator
* org.apache.xmlrpc.demo.proxy.Adder=org.apache.xmlrpc.demo.proxy.AdderImpl
*/
phm.load(Thread.currentThread().getContextClassLoader(),
"MyHandlers.properties");
xmlRpcServer.setHandlerMapping(phm);
Или вы можете добавить их напрямую:
/* You may also provide the handler classes directly,
* like this:
* phm.addHandler("Calculator",
* org.apache.xmlrpc.demo.Calculator.class);
* phm.addHandler(org.apache.xmlrpc.demo.proxy.Adder.class.getName(),
* org.apache.xmlrpc.demo.proxy.AdderImpl.class);
*/
Смотрите:https://ws.apache.org/xmlrpc/server.html
Вы все еще можете добавить обработчик, подобный этому:
WebServer server = new WebServer(Integer.parseInt($[0]));
PropertyHandlerMapping handlerMapping = new PropertyHandlerMapping();
handlerMapping.addHandler("area", AreaHandler.class);
XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer();
xmlRpcServer.setHandlerMapping(handlerMapping);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer.getConfig();
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
server.start();
Комментарии:
1. версия jar — 3.1.3
2. Можете ли вы поделиться ссылкой на более старую версию файлов jar xmlrpc, чтобы она поддерживала метод AddHandler
3. Обновленный ответ, вы все равно сможете добавить обработчик, но для этого используйте класс сопоставления обработчика свойств.
4. Я получаю это исключение ошибки в потоке «main» java.lang. NoClassDefFoundError: org/apache/commons/logging/LogFactory в org.apache.xmlrpc.server.XmlRpcStreamServer. <clinit> (неизвестный источник) в org.apache.xmlrpc.webserver. WebServer.newXmlRpcStreamServer (неизвестный источник) в org.apache.xmlrpc.webserver. Веб-сервер. <инициализация> (неизвестный источник) ;
5. в этой строке: server = новый веб-сервер (Integer.parseInt($[0]));//$[0]=4404