2009年3月19日星期四

用Axis2 接受和发送二进制对象的总结

接收:(Server端返回的是一个ObjectPack ObjectPack.name是文件的名称,ObjectPack.bin是byte[]类型的binary)
经过我的测试,类似下面发送的方法用RPCServiceClient.invokeBlocking()得到byte[],然后转化成文件这样不行,只好用以下的方式:
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/services/Pic");
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
"http://pic.webservice.com", "get");
OMElement data = fac.createOMElement("get", omNs);
OMElement name= fac.createOMElement("name", omNs);
email.setText("avatar.png");
data.addChild(email);

ServiceClient sender = new ServiceClient();
Options options =sender.getOptions();
options.setSoapVersionURI(SOAP11Constants.SOAP_ENVELOPE_NAMESPACE_URI);
options.setTo(targetEPR);
// enabling MTOM in the client side
options.setProperty(Constants.Configuration.ENABLE_MTOM,
Constants.VALUE_TRUE);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
System.out.println(data);
OMElement ome = sender.sendReceive(data);
Iterator ite = ome.getFirstElement().getChildElements();
String fileName = "avatar.png";
int counter = 0;
while (ite.hasNext()) {
OMElement e = ite.next();
if (counter++ == 0) {
fileName = e.getText();
System.out.println(fileName);
} else {
OMText binaryNode = (OMText) e.getFirstOMChild();
binaryNode.setOptimize(true);// 必须加此句,否则会出现ContentID is null的异常!
DataHandler actualDH = (DataHandler) binaryNode
.getDataHandler();
FileOutputStream fos = new FileOutputStream(new File("E:\\"
+ fileName));
InputStream is = actualDH.getInputStream();
byte[] b = new byte[1024];
while (true) {
int i = is.read(b);
if (i == -1)
break;
fos.write(b, 0, i);
}
fos.flush();
fos.close();
is.close();
}
}
发送:(Server端接收的是参数是name:文件名称, byte[] b)
经过我的测试,用上面的ServerClient的方式,用DataHandler 会报错,只好用RPCServiceClient
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8080/Pic");
options.setTo(targetEPR);
File file = new File("E:\\avatar.png");
FileInputStream fin = new FileInputStream(file);
byte[] b = new byte[(int) file.length()];
fin.read(b, 0, b.length);
fin.close();
Object[] opAddEntryArgs = new Object[] { "name", b };
Class[] classes = new Class[] { Boolean.class };
QName opAddEntry = new QName(
"http://pic.webservice.com",
"changeMessengerDisplayPic");
Boolean result = (Boolean) serviceClient.invokeBlocking(opAddEntry,
opAddEntryArgs, classes)[0];
System.out.println("result:" + result);

没有评论: