描述
现在的需求是基于java corba实现一个分布式文件系统应用,基本功能无非就是上传、下载这两个功能。
在写程序之前,脑子里对系统的整体架构或对编程思路有一个high level的理解是必须的。至于Java corba中的入门程序,这里就不多说了,百度一大片,基本都是那个Hello World
的实例程序了,英语还不错的可以看>>这里<<,官方文档解释的比较清晰,请务必看一个入门教程,不然这篇文章你可能看不太懂。(我忽略了许多入门知识)
在这个系统中,我们要考虑的也就是怎么做到上传、下载了,对于纯Java编程来说,这也无非就是FileInputStream
、FileOutputStream
操作几下,但分布式系统里面,怎么处理呢?怎么把字节流通过网络传输呢?其实很简单,去查一下corba IDL
接口里面对字节流是怎样定义的,然后在相关的实现类中实现即可,这里说的太笼统了,下面我将一一叙述整个项目的开发流程。请着重看下面编写IDL接口文件步骤中的技术核心部分。
开发环境
- jdk 1.8
- windows 操作系统
- intellij IDEA
开发步骤
一个标准的Java corba程序,开发流程可大致分为下面的几个步骤:
- (1) 编写IDL接口文件
- (2) 编译IDL接口文件
- (3) 实现远程对象
- (4) 实现服务器程序
- (5) 实现客户端程序
- (6) 编译客户端和服务端程序
- (7) 分别运行服务端和客户端程序
(1) 编写IDL接口文件
在最开始的时候,我们说了要实现流在网络中传输,我们必须知道corba IDL
接口里面对字节流的定义方式,关于corba IDL
的具体介绍可以>>点击这里<<.
技术核心
文件字节流嘛,传输的时候肯定是8字节的序列,可是我们又不知道文件的长度(也就是说无法确定字节流序列要开多大),没关系,IDL
里面的sequence<octet>
就是声明一个无限制长度的字节序列(idlj
程序编译后将之会匹配成byte[]
类型),这样就好办了。
上传文件时,我在客户端这边打开一个FileInputStream
文件输入流,然后读出文件输入流的内容到一个byte[]数组
里面,然后再把这个byte[]数组
转化为的内容送给corba的输入流
传到服务端,服务端又取出corba的输入流
中的内容,转化为一个byte[]数组
,然后放到一个FileOutputStream
文件输出流中去,这样就可以做到将客户端上的文件保存在服务端中了。
下载文件类似,客户端这边告诉服务端两个参数,一个是待下载的文件名,另一个是输出参数fileData
,服务端那边打开一个FileInputStream
文件输入流,然后读出文件输入流的内容到一个byte[]数组
里面,然后再把这个byte[]数组
转化为的内容放到客户端调用方法时传递的那个输出参数fileData
中,然后客户端把输出参数fileData
的内容放到一个byte[]数组
中,然后放到一个FileOutputStream
文件输出流中去,这样就可以做到将服务端上的文件保存在客户端中了。
好,这个核心解决了基本程序就跃然于屏幕上了,o( ̄︶ ̄)o
// TFile.idl
module corba
{
typedef sequence<octet> MyData;
typedef sequence<string> MyList;
interface TFile
{
/* fileData为服务端返回的流 */
boolean download(in string fileName,out MyData fileData);
/* fileData为客户端输入的流 */
boolean upload(in string fileName,in MyData fileData);
/* 服务器端所有可下载的文件名 */
void listAllFile(out MyList allFileNames);
};
};
in表示是输入参数,out表示输出参数(都是站在客户端的立场上看的哈!),我这里还加了一个功能,就是显示出服务器上的所有文件列表(这都是无所谓的功能了)。
sequence<string>
想必你也知道是什么意思了,恩,就是一个不知道大小的字符串序列了。
(2) 编译IDL接口文件
jdk中自带了idlj编译程序,你可以在你的jdk目录下的bin文件夹中找到它。额,是的,你要用这个的话需要配置好java环境变量哈,这个比较简单,就不说了。
idlj -fall TFile.idl (for all)
idlj -fclient TFile.idl (for client)
idlj -fserver TFile.idl(for server)
假如你要把客户端和服务端分开开发的的话(想必生产环境下肯定是这样的),编译时就要带上 -fclient 或者 -fserver选项,corba在客户端那边会生成_stub桩文件,服务端会生成一个POA文件