How to create an RMI system

本文详细介绍了一种简单远程方法调用(RMI)系统的创建步骤,包括接口定义、实现类编写、服务器与客户端设置等,并针对常见问题提供了具体解决方案。

http://patriot.net/~tvalesky/easyrmi.html


http://userpages.umbc.edu/~tarr/dp/lectures/RMI.pdf


http://www1.cs.columbia.edu/dcc/nestor/presentations/java-rmi/java-rmi-handouts.pdf


In this article, I lead you through the process of creating a verysimple RMI system. (This example was inspired by the RMI demo in Orfaliand Harkey's book on CORBA; I thought it was still too complicated, so I'vetaken the simplification a bit further). I've tried to make this example as bare-bones aspossible in order to keep the focus on the steps needed to make an RMIprogram work. I've also tried to avoid skipping any steps that mightthrow a first-time user, and have tried to ensure that all steps areperformed in the proper order (there are a couple of steps in whichorder matters). That being said, let's do some RMI!

Steps to creation of an RMI system:

The short version

1) Create an interface. (in this case, the interface is myRMIInterface.java).
2) Create a class that implements the interface. (in this case, myRMIImpl.java).
3) Create a server that creates an instance of this class
4) Create a client that connects to the server object using Naming.lookup()
5) Compile these classes.
6) Run the RMI interface compiler on the .class file of the implementation
   class (in this case, you'd say "rmic myRMIImpl").
7) Start the RMI registry (on Windows NT/95, say "start rmiregistry").
8) Start the server class ("start java myRMIServer").
9) Run the client program ("java myRMIClient").
The long version
  1. Create an interface
    An interface is similar to a pure virtual class in C++; it defines the methods (and the arguments to the methods) that will be available in a class that implements it; however, it doesn't actually implement any of the methods.
    The interface I created for this example is myRMIInterface.java. It contains only one method; the method takes no arguments and returns an object of type java.util.Date. Note 2 things about this interface: 1) it extends the java.rmi.Remote interface (all interfaces used in RMI must do this). 2) the method throws a java.rmi.RemoteException (every method in a remote object's interface must specify this exception in its "throws" clause; this exception is a superclass of all RMI exceptions that can be thrown. See the JDK 1.1 final docs (in the java.rmi section) for a complete list of exceptions that can be thrown.
  2. Create a class that implements the interface
    In this example, the implementation is found in myRMIImpl.java. This class must extend java.rmi.UnicastRemoteObject and must implement the interface you created in step 1. In my example, the only method that needs to be implemented is getDate(), which returns the current date and time on the system. Note 2 things about the constructor: 1) the call to super(). 2) the call to Naming.rebind(name, this). This call informs the RMI registry that this object is available with the name given in "String name". Other than that, this object simply implements all the methods declared in the interface.
  3. Create a server that creates an instance of the "impl" class
    In this example, the server class is myRMIServer.java. In this case, the server is pretty simple. It does 2 things: 1) Installs a new RMISecurityManager (Note that RMI uses a different security manager from the security manager used for applets). 2) Creates an instance of the myRMIImpl class, and gives it the name "myRMIImplInstance". The myRMIImpl object takes care of registering the object with the RMI registry. After this code is run, the object will be available to remote clients as "rmi://
  4. Create a client that connects to the server object using Naming.lookup().
    In this example, the client class is myRMIClient.java. The client first installs a new RMI Security Manager (see previous step), then uses the static method Naming.lookup() to get a reference to the remote object. Note that the client is using the interface to hold the reference and make method calls. You should make sure you've created your interface before you try to build the client, or you'll get "class not found" errors when you try to compile your client.
  5. Compile these classes
    Just do "javac *.java". Piece of cake. :-)
  6. Run the RMI interface compiler on your implementation class.
    This step generates some additional Java classes. They're stubs and skeletons used by RMI; you don't have to worro about what's in them. Note: You only need to run rmic on the class that implements your RMI interface. In this case, you'd do "rmic myRMIImpl". Also note that the rmic compiler runs on a .class file, not a .java file.
  7. Start the RMI registry
    OK. You're done with development at this point; you've built all the code you need to run this example. Now you're setting up the environment so that you can run it. rmiregistry is a program that comes with the JDK 1.1 final; you can find it in the "bin" directory of your JDK installation. Under Windows 95 or NT, you can simply say "start rmiregistry" on the command line, which will cause the RMI registry to be started in its own DOS window. The RMI registry must be started before you can start your server.
  8. Start your RMI server program
    Under Windows 95 or NT, say "start java myRMIServer" on the command line. This starts the server running. As we discussed earlier, the server then creates an instance of myRMIImpl and makes it known to the RMI server as "myRMIImplInstance".
  9. Run your client program
    Say "java myRMIClient". The program will ask the RMI registry for a reference to "myRMIImplInstance". After it has this reference, the client can invoke any methods declared in the myRMIInterface interface as if the object were a local object.

Problems that you may run into

problem: You get a "class not found" error when running rmic
solution: Add the current directory to your classpath.

problem: You get the following error when running the client

Exception occured: java.rmi.UnmarshalException: Return value class not found; nested exception is:
        java.lang.ClassNotFoundException: myRMIImpl_Stub

solution: The file myRMIImpl_Stub.class must be deployedwith your client application (that is, you must place it somewherein the classpath of the client machine; If you were using an appletas a client, you would place it in the directory specified in theCODEBASE parameter to achieve the same effect).

problem: You get the following error when running the client

C:\test3>java myRMIClient 127.0.0.1
Exception occured: java.security.AccessControlException: access denied (java.net
.SocketPermission 127.0.0.1:1099 connect,resolve)
or the following when running the server
C:\test3>java myRMIServer
Exception occurred: java.security.AccessControlException: access denied (java.ne
t.SocketPermission 127.0.0.1:1099 connect,resolve)

solution: I experienced this problem under Java2 with the default securitypolicy in place. You'll need to modify your security policy to allow these activitiesto take place. A full writeup on this is available at The Sun RMI tutorial page.
In summary, you'll need to do the following:
  1. Create a new security policy file. See your JDK docs orthe links referenced from the Sun RMI tutorial for more information on this.
  2. When you run the client or the server, pass the location of your new security policyfile in as an argument. This allows you to run under a new policy without having to modifyyour system policy files. Here is a .policy file that grants all permissions to everybody. DO NOT install this policy file in a production system. However, you can use it in trivial testing. You can then run the server with thecommand line
    java -Djava.security.policy=c:\test3\wideopen.policy myRMIServer
    or the client with
    java -Djava.security.policy=c:\test3\wideopen.policy myRMIClient 127.0.0.1
    Of course, you'd replace c:\test3\wideopen.policy with the full path to your ownproperties file.

    Here is another policy file that includes only the permissionsnecessary to run this app.


And that's the whole story of how to create and run an RMI program. It'sreally not that bad, is it? :-)
Here's the source code:
myRMIInterface.java
myRMIImpl.java
myRMIServer.java
myRMIClient.java
胚胎实例分割数据集 一、基础信息 • 数据集名称:胚胎实例分割数据集 • 图片数量: 训练集:219张图片 验证集:49张图片 测试集:58张图片 总计:326张图片 • 训练集:219张图片 • 验证集:49张图片 • 测试集:58张图片 • 总计:326张图片 • 分类类别: 胚胎(embryo):表示生物胚胎结构,适用于发育生物学研究。 • 胚胎(embryo):表示生物胚胎结构,适用于发育生物学研究。 • 标注格式:YOLO格式,包含实例分割的多边形标注,适用于实例分割任务。 • 数据格式:图片来源于相关研究领域,格式为常见图像格式,细节清晰。 二、适用场景 • 胚胎发育AI分析系统:构建能够自动分割胚胎实例的AI模型,用于生物学研究中的形态变化追踪和量化分析。 • 医学与生物研究:在生殖医学、遗传学等领域,辅助研究人员进行胚胎结构识别、分割和发育阶段评估。 • 学术与创新研究:支持计算机视觉与生物医学的交叉学科研究,推动AI在胚胎学中的应用,助力高水平论文发表。 • 教育与实践培训:用于高校或研究机构的实验教学,帮助学生和从业者掌握实例分割技术及胚胎学知识。 三、数据集优势 • 精准与专业性:实例分割标注由领域专家完成,确保胚胎轮廓的精确性,提升模型训练的可靠性。 • 任务专用性:专注于胚胎实例分割,填补相关领域数据空白,适用于细粒度视觉分析。 • 格式兼容性:采用YOLO标注格式,易于集成到主流深度学习框架中,简化模型开发与部署流程。 • 科学价值突出:为胚胎发育研究、生命科学创新提供关键数据资源,促进AI在生物学中的实际应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值