IServer类:
package Call.Information.ServerRpc;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.plugbase.common.util.ResourcesUtil;
public abstract class IServer {
private static final Log LOG = LogFactory.getLog(IServer.class);
private static IServer server;
private static final String RPCTYPE_CONFIG = "rpcType";
private static final String DEFAULT_RPCTYPE = "xmlrpc";
private static final String NIO_RPCTYPE = "xmlrpc";
private static final String SERVERHANDLERLISTNAME_CONFIG ="ServerHandlerListName";
private static final String SERVERHANDLERLISTCLASS_CONFIG ="ServerHandlerListClass";
private static final String SPACEMARK = ",";
private static Properties params=null;
protected static HashMap<String, Class> handlerMap = new HashMap<String, Class>();
private static void loadParameter(){
try {
LOG.debug("loadParameter");
ResourcesUtil.setCharset(Charset.forName("UTF-8"));
params = ResourcesUtil.getResourceAsProperties("server.properties");
if(params.getProperty(RPCTYPE_CONFIG, DEFAULT_RPCTYPE).equals(DEFAULT_RPCTYPE)){
server = new XmlrpcServer();
}
} catch (IOException e) {
LOG.error("Server init Faild!",e);
return;
}
}
private static void initServer(){
loadParameter();
LOG.debug("initServer..");
String listname = params.getProperty(SERVERHANDLERLISTNAME_CONFIG);
String listclass = params.getProperty(SERVERHANDLERLISTCLASS_CONFIG);
if(listname!=null&&listclass!=null){
String[] names = listname.split(SPACEMARK);
String[] classes = listclass.split(SPACEMARK);
if(names.length==classes.length){
for(int i=0;i<names.length;i++){
try {
handlerMap.put(names[i], Class.forName(classes[i]));
} catch (ClassNotFoundException e) {
LOG.error("Server init Faild!",e);
return;
}
}
}
}
LOG.debug("initServer ok!");
}
protected abstract void startserver(String arg,Properties params);
public static void start(String arg){
initServer();
server.startserver(arg,params);
}
public static void main(String[] args) {
if(args.length==0){
args=new String[1];
args[0] = "";
//args[0] = "stop";
}
server.start(args[0]);
}
}
XmlrpcServer类:
package Call.Information.ServerRpc;
import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xmlrpc.XmlRpcRequest;
import org.apache.xmlrpc.XmlRpcRequestConfig;
import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
import org.apache.xmlrpc.webserver.WebServer;
public class XmlrpcServer extends IServer {
public final static String SERVER_PORT = "xmlrpc.server.port";
public final static String SERVER_USER = "xmlrpc.server.user";
public final static String SERVER_PASS = "xmlrpc.server.pass";
public final static String DEFAULT_SERVER_PORT = "";
public final static String DEFAULT_SERVER_USER = "";
public final static String DEFAULT_SERVER_PASS = "";
public final static Log LOG = LogFactory.getLog(XmlrpcServer.class);
public final static Map<String, String> AUTHENTICATION_MAP = new HashMap<String, String>();
public int port = 3306;
private WebServer webServer;
private XmlRpcServer xmlRpcServer;
public static class UserPasswordAuthenticationHandler implements
AuthenticationHandler {
public boolean isAuthorized(XmlRpcRequest request) {
XmlRpcRequestConfig config = request.getConfig();
if (config instanceof XmlRpcHttpRequestConfig) {
XmlRpcHttpRequestConfig httpRequestConfig = (XmlRpcHttpRequestConfig) config;
String user = httpRequestConfig.getBasicUserName();
String pass = httpRequestConfig.getBasicPassword();
for (Iterator<String> it = AUTHENTICATION_MAP.keySet()
.iterator(); it.hasNext();) {
String key = it.next();
String value = AUTHENTICATION_MAP.get(key);
if (key.equals(user) && value.equals(pass))
return true;
}
}
return false;
}
}
public static class ServerThread extends Thread {
public ServerThread(int port) {
webServer = new WebServer(port);
xmlRpcServer = webServer.getXmlRpcServer();
}
public void run() {
PropertyHandlerMapping phm = new PropertyHandlerMapping();
try {
phm.setAuthenticationHandler(new UserPasswordAuthenticationHandler());
for(Iterator<String> it = handlerMap.keySet().iterator();it.hasNext();){
String name = it.next();
Class clazz = handlerMap.get(name);
phm.addHandler(name, clazz);
}
} catch (Exception e) {
e.printStackTrace();
return;
}
xmlRpcServer.setHandlerMapping(phm);
XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer
.getConfig();
serverConfig.setBasicEncoding("UTF-8");
serverConfig.setEnabledForExtensions(true);
serverConfig.setContentLengthOptional(false);
try {
webServer.start();
} catch (Exception e) {
return;
}
}
public void shutdown() {
webServer.shutdown();
this.interrupt();
}
protected void finalize() {
webServer = null;
xmlRpcServer = null;
}
private WebServer webServer;
private XmlRpcServer xmlRpcServer;
}
public void startserver(String arg, Properties params) {
Properties pairs = params;
String lockFile = System.getProperty("java.io.tmpdir") + "/call.lock";
int port = Integer.parseInt(pairs.getProperty(SERVER_PORT,
DEFAULT_SERVER_PORT));
File lock = new File(lockFile);
if (arg.equals("stop")) {
lock.delete();
System.exit(-1);
}
ServerThread thread = new ServerThread(port);
if (lock.exists()) {
LOG.info("XmlrpcServer: Create lock file [" + lockFile + "] faild.");
System.exit(-1);
}
try {
lock.createNewFile();
} catch (IOException e1) {
LOG.info("XmlrpcServer: Create lock file faild.");
}
String sql = "select * from user";
SQLHelper helper;
try {
helper = new SQLHelper();
ResultSet rs = helper.results(sql);
while (rs.next()) {
AUTHENTICATION_MAP.put(rs.getString("username"), rs.getString("password"));
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String user = pairs.getProperty(SERVER_USER, DEFAULT_SERVER_USER);
String pass = pairs.getProperty(SERVER_PASS, DEFAULT_SERVER_PASS);
AUTHENTICATION_MAP.put(user, pass);
LOG.info("XmlrpcServer : Listen on [" + port + "]");
thread.start();
while (lock.exists()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
thread.stop();
}
}
thread.shutdown();
while (thread.getState() == Thread.State.RUNNABLE) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
LOG.info("XmlrpcServer : Shutdown");
System.exit(0);
}
}
TestXmlrpc类:
package Call.Information.clientRpc;
import java.net.URL;
import java.util.List;
import java.util.Map;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
/**
*
* @version TextXmlRpc.java v. 1.0.0 2012-5-16
* @author FengXiYang
* copyright (c) 2012 北京叁加伍网络科技有限公司 http://www.3jia5.com
*/
public class TestXmlRpc {
public static void main(String[] args) {
String url = "http://211.147.6.238:61002/xmlrpc";
String username = "net_counts31582012";
String password = "net_@3158cn&2011";
String method = "CountsNet.getCq_Domain_Url"; //CALL.Send
Object[] pars = new Object[10];
pars[0] = ""; //客户日志字符串(#分隔) (登陆ID,登陆用户名,IP,描述,时间)
pars[1] = "1"; //第几页
pars[2] = "10"; //每页显示条数
pars[3] = "20120506"; //开始时间(yyyyMMdd)
pars[4] = "20120506"; //结束时间(yyyyMMdd)
pars[5] = "2"; //统计主域名ID(必填,1:cn,2:net,3:9978)
pars[6] = ""; //当前域名, (查多个)
pars[7] = ""; //项目ID
pars[8] = ""; //员工ID
pars[9] = ""; //新闻ID
try{
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL(url));
config.setBasicUserName(username);
config.setBasicPassword(password);
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
String result = (String) client.execute(method, new Object[]{pars});
System.out.println(result);
}
catch(Exception ex){
ex.printStackTrace();
}
}
}