JAVA服务端(jetty)
public class EntryClass {
public static void main(String argv[]) throws Exception {
Server server = new Server(80);
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/");
handler.addServlet(new ServletHolder(new MyHproseServlet()), "/rpc");
server.setHandler(handler);
server.start();
server.join();
}
}
public class MyHproseServlet extends HproseServlet {
@Override
protected void setGlobalMethods(HproseMethods hproseMethods) {
hproseMethods.addInstanceMethods(new RpcHandler());
}
}
interface IRpcHandler {
String addx(int a, String b, double c, String[] d, byte[] e);
}
public class RpcHandler implements IRpcHandler {
@Override
public String addx(int a, String b, double c, String[] d, byte[] e) {
return String.format("Hi: %d %s %f %d %d", a, b, c, d.length, e.length);
}
}
C++客户端
using namespace std;
using namespace hprose;
HproseHTTPClient client("http://localhost/rpc");
int _tmain(int argc, _TCHAR* argv[])
{
vector<Any> args;
args.push_back(123);// int
args.push_back(string("789"));// string (utf8)
args.push_back(3.6);// double
{
vector<string> p4;
p4.push_back("1");
p4.push_back("2");
p4.push_back("aaa");
args.push_back(p4);// string array
}
{
vector<unsigned char> p5;
p5.push_back(0x00);
p5.push_back(97);
p5.push_back(0x00);
p5.push_back(0x00);
args.push_back(p5);// bytes
}
string r = client.Invoke<string>("addx", args);
return 0;
}
结束语
JAVA的支持很好, 各种自动转换和映射
C++就比较蛋疼了, 没找到什么文档, 想去官方论坛问可是新账号两小时内禁止发言, 囧
刚开始不知如何传输字节流
最后还是翻源码, 尝试了N种方法才知道是vector<unsigned char>那么个玩意
目前搞定了C++传输int, double, string, 数组, 二进制流. 足够应对大部分需求
瞅了瞅代码应该还支持queue, list, map类型, 以后用到以后再说吧
若接口返回非基本数据类型, 大概就要用到javabean了
可java里面的bean对应C++里的啥, struct?class?
目前想到的就是传protobuf的流当返回值, 或者传XML/JSON来解析