基于apache mina 2.0.0 M4和google Protocol Buffers 2.0.3的java RPC实例(6.Client端的接口调用)

作者:lizongbo 发表于:01:03. 星期四, 一月 15th, 2009
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明

接上一篇:http://618119.com/archives/2009/01/15/130.html
1.ProtobufRpcChannel.java(相当于thrift的TBinaryProtocol).
[code]
package com.lizongbo.protobufrpc;

import com.google.protobuf.RpcChannel;
import java.net.URL;
import com.google.protobuf.Descriptors.MethodDescriptor;
import com.google.protobuf.RpcController;
import com.google.protobuf.Message;
import com.google.protobuf.RpcCallback;
import java.net.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class ProtobufRpcChannel implements RpcChannel {
private URL serviceUrl = null;
public ProtobufRpcChannel(String url) {
try {
try {
URL.setURLStreamHandlerFactory(new
HessianURLStreamHandlerFactory());
} catch (Exception ex) {
ex.printStackTrace();

}
serviceUrl = new URL(url);
} catch (MalformedURLException ex) {
ex.printStackTrace();
}
}

public void callMethod(MethodDescriptor method, RpcController controller,
Message request, Message responsePrototype,
RpcCallback done) {
try {
System.out.println(method.getService().getFullName());
System.out.println(method.getFullName());
method.toProto().toByteArray();
System.out.println(responsePrototype.getClass());
if ("hessiantcp".equalsIgnoreCase(serviceUrl.getProtocol()) ||
"http".equalsIgnoreCase(serviceUrl.getProtocol())) {
Socket socket = new Socket(serviceUrl.getHost(),
serviceUrl.getPort());
DataOutputStream out = new DataOutputStream(socket.
getOutputStream());
DataInputStream in = new DataInputStream(socket.getInputStream());
ProtobufRPCRequest req = new ProtobufRPCRequest();
req.setServiceName(method.getService().getFullName());
req.setMethodName(method.getName());
req.setRequestMessage(request.toByteArray());
out.write(req.toByteArray()); //传数据包
out.flush(); //例子此处尚不完善,会有1448错误
int len = in.readInt();
System.out.println("应答包长:" + len);
byte[] buf = new byte[len - 4];
in.read(buf, 0, buf.length);
Message res = responsePrototype.newBuilderForType().mergeFrom(
buf).build();
done.run(res);
in.close();
out.close();
} else {
//@todo
}
}

catch (Exception e) {
throw new RuntimeException(e);
}

}
}

[/code]

2.RPCTest.java(客户端接口调用)
[code]
package com.lizongbo.protobufrpc;

import java.net.*;
import com.google.protobuf.RpcCallback;
import com.lizongbo.mobileqq.UserInfoServiceRpcController;
import com.lizongbo.mobileqq.QQUserInfoProtos;

public class RPCTest {

public static void main(String[] args) {
for (int i = 123456; i < 123458; i++) {
try {
ProtobufRpcChannel rpcChannel = new ProtobufRpcChannel(
"hessiantcp://127.0.0.1:8080/mobileqq");
UserInfoServiceRpcController controller = new
UserInfoServiceRpcController();
QQUserInfoProtos.UserInfoService service = QQUserInfoProtos.
UserInfoService.newStub(rpcChannel);
QQUserInfoProtos.GetUserInfoRequest.Builder builder =
QQUserInfoProtos.GetUserInfoRequest.newBuilder();
builder.setQqNo(123456);
QQUserInfoProtos.GetUserInfoRequest req = builder.build();
service.getUserInfo(controller,
req,
new RpcCallback GetUserInfoResponse>() {
public void run(QQUserInfoProtos.GetUserInfoResponse
response) {
System.out.println(response.getQqNo() + ",result" +
response.getResult() +
"\t" +
response.getUserInfo());
}
});

} catch (Exception ex) {
ex.printStackTrace();
}

}

}
}

[/code]

Tags: apache mina, google protobuf, Hessian, Java, RPC

Related posts

标签: , , , ,

留下回复