服务器使用实例
From Apache OpenOffice Wiki
< Zh | Documentation
此使用实例可以将任意 UNO 组件导出为远程服务器。例如,使用 com.sun.star.io.Pipe 服务,它已由办公软件附带的组件实现。该服务导出 com.sun.star.io.XOutputStream 和 com.sun.star.io.XInputStream 接口。数据通过输出流写入管道,并且再次从输入流读取相同的数据。要将此组件导出为远程服务器,请切换到 <OfficePath>/program 目录并执行以下命令行。
i:\o641l\program>uno -s com.sun.star.io.Pipe -ro types.rdb -ro services.rdb -u uno:socket,host=0,port=2002;urp;test > accepting socket,host=0,port=2083...
现在客户端程序可以连接到服务器。客户端可能类似如下所示:
import com.sun.star.lang.XServiceInfo; import com.sun.star.uno.XComponentContext; import com.sun.star.bridge.XUnoUrlResolver; import com.sun.star.io.XOutputStream; import com.sun.star.io.XInputStream; import com.sun.star.uno.UnoRuntime; // Note: This example does not do anything meaningful, it shall just show, // how to import an arbitrary UNO object from a remote process. class UnoExeClient { public static void main(String [] args) throws java.lang.Exception { if (args.length != 1) { System.out.println("Usage : java UnoExeClient uno-url"); System.out.println(" The imported object must support the com.sun.star.io.Pipe service"); return; } XComponentContext ctx = com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null); // get the UnoUrlResolver service Object o = ctx.getServiceManager().createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver" , ctx); XUnoUrlResolver resolver = (XUnoUrlResolver) UnoRuntime.queryInterface( XUnoUrlResolver.class, o); // connect to the remote server and retrieve the appropriate object o = resolver.resolve(args[0]); // Check if we got what we expected // Note: This is not really necessary, you can also use the try and error approach XServiceInfo serviceInfo = (XServiceInfo) UnoRuntime.queryInterface(XServiceInfo.class,o); if (serviceInfo == null) { throw new com.sun.star.uno.RuntimeException( "error: The object imported with " + args[0] + " did not support XServiceInfo", null); } if (!serviceInfo.supportsService("com.sun.star.io.Pipe")) { throw new com.sun.star.uno.RuntimeException( "error: The object imported with "+args[0]+" does not support the pipe service", null); } XOutputStream output = (XOutputStream) UnoRuntime.queryInterface(XOutputStream.class,o); XInputStream input = (XInputStream) UnoRuntime.queryInterface(XInputStream.class,o); // construct an array. byte[] array = new byte[]{1,2,3,4,5}; // send it to the remote object output.writeBytes(array); output.closeOutput(); // now read it again in two blocks byte [][] read = new byte[1][0]; System.out.println("Available bytes : " + input.available()); input.readBytes( read,2 ); System.out.println("read " + read[0].length + ":" + read[0][0] + "," + read[0][1]); System.out.println("Available bytes : " + input.available()); input.readBytes(read,3); System.out.println("read " + read[0].length + ":" + read[0][0] + "," + read[0][1] + "," + read[0][2]); System.out.println("Terminating client"); System.exit(0); } }
引导组件上下文后,UnoUrlResolver
服务被实例化以访问远程对象。解析远程对象后,请检查其是否真正支持 Pipe 服务。例如,尝试将此客户端连接到运行的 OpenOffice.org — 此检查将会失败。具有五个元素的 byte array 将被写入远程服务器,并使用两个 readBytes()
调用再次读取。使用以下命令行启动客户端可以连接到上面启动的服务器。您应获得以下输出:
I:\tmp>java UnoExeClient uno:socket,host=localhost,port=2083;urp;test Available bytes : 5 read 2:1,2 Available bytes : 3 read 3:3,4,5 Terminating client
Content on this page is licensed under the Public Documentation License (PDL). |