Java Rmi如何实现两个协同通信客户端下载之间的通信 求说的具体点

java如何实现两个客服端之间互相发送信息_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
java如何实现两个客服端之间互相发送信息
客户端1发信息给服务器,服务器转发信息给客户端2;客服端2接受服务端发来的信息,然后发信息给服务端,服务端转发信息给客服端1。客服端1和客户端2之间可以像聊天一样一直发信息
我有更好的答案
即客户端定时去查消息,例如A向B发消息,一但有数据写入就向客户端发送数据用轮询,也是可以的,以下给你提供思路:用长连接或者java sokcet 即所有客户端都和服务器保持连接,或者极光推送,都是免费他们的推送技术有个叫推聊的功能就可以直接推送给指定的客户端你不需要去实现这种逻辑当然如果你非要用自己服务器去做的话,是通过服务器来处理的建议你查看百度云推送两个客户端发送消息
你这思路都有了还不会写么。。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包博客分类:
一个正常工作的RMI系统由下面几个部分组成:
远程服务的接口定义
远程服务接口的具体实现
桩(Stub)和框架(Skeleton)文件
一个运行远程服务的服务器
一个RMI命名服务,它允许客户端去发现这个远程服务
类文件的提供者(一个HTTP或者FTP服务器)
一个需要这个远程服务的客户端程序
1、远程服务的接口定义
RMI对接口有着强烈的依赖。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节。所以客户得到远程对象的一个句柄正好同一些本地的根代码连接,有后者负责通过网络通信。但我们并不关心这些事情,通过自己的接口句柄发送消息即可。
创建一个远程接口时,必须遵守下列规则:
1)、远程接口必须为public属性(不能有“包访问”;也就是说,他不能是“友好的”)。否则,一旦客户试图装载一个实现了远程接口的远程对象,就会得到一个错误。、
2)、远程接口必须扩展接口java.rmi.Remote。
3)、除与应用程序本身有关的违例,远程接口中的每个方法都必须在自己的throws从句中声明java.rmi.RemoteException.
4)、作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远程接口,不可声明为实施类。
第一步就是建立和编译服务接口的Java代码。这个接口定义了所有的提供远程服务的功能:
//Calculator.java
//define the interface
import java.rmi.R
public interface Calculator extends Remote
public long add(long a, long b)
throws java.rmi.RemoteE
public long sub(long a, long b)
throws java.rmi.RemoteE
public long mul(long a, long b)
throws java.rmi.RemoteE
public long div(long a, long b)
throws java.rmi.RemoteE
注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
2、远程服务接口的具体实现
第二步,对远程服务接口的具体实现,这是一个CalculatorImpl类文件:
//CalculatorImpl.java
//Implementation
import java.rmi.server.UnicastRemoteObject
public class CalculatorImpl extends UnicastRemoteObject implements Calculator
public CalculatorImpl()
throws java.rmi.RemoteException {
public long add(long a, long b)
throws java.rmi.RemoteException {
return a +
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a -
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a *
public long div(long a, long b)
throws java.rmi.RemoteException {
return a /
这个实现类使用了UnicastRemoteObject去联接RMI系统。在这个例子中,是直接的从UnicastRemoteObject这个类上继承的,事实上并不一定要这样做,如果一个类不是从UnicastRmeoteObject上继承,那必须使用它的exportObject()方法去联接到RMI。
如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。当这个构造函数调用了super(),它久激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
3、桩(Stubs)和框架(Skeletons)
接下来就是要使用RMI编译器rmic来生成桩和框架文件,这个编译运行在远程服务实现类文件上。
&rmic CalculatorImpl
在相关目录下运行上面的命令,成功执行完上面的命令将会发现一个Calculator_stub.class文件,如果使用的Java2SDK,那么还可以发现Calculator_Skel.class文件。
4、主机服务器
远程RMI服务必须是在一个服务器中运行的。下面定义的CalculatorServer类是一个非常简单的服务器。
//CalculatorServer.java
import java.rmi.N
public class CalculatorServer {
public CalculatorServer() {
Calculator c = new CalculatorImpl();
Naming.rebind("rmi://localhost:1099/CalculatorService", c);
} catch (Exception e) {
System.out.println("Trouble: " + e);
public static void main(String args[]) {
new CalculatorServer();
客户端源代码如下:
//CalculatorClient.java
import java.rmi.N
import java.rmi.RemoteE
import java.net.MalformedURLE
import java.rmi.NotBoundE
public class CalculatorClient {
public static void main(String[] args) {
Calculator c = (Calculator)
Naming.lookup(
"rmi://localhost
/CalculatorService");
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
catch (MalformedURLException murle) {
System.out.println();
System.out.println(
"MalformedURLException");
System.out.println(murle);
catch (RemoteException re) {
System.out.println();
System.out.println(
"RemoteException");
System.out.println(re);
catch (NotBoundException nbe) {
System.out.println();
System.out.println(
"NotBoundException");
System.out.println(nbe);
java.lang.ArithmeticException
ae) {System.out.println();
System.out.println(
"java.lang.ArithmeticException");
System.out.println(ae);
6、 运行RMI系统
上面建立了所有运行这个简单RMI系统所需的文件,现在可以运行这个RMI系统了,由于是在命令控制台下运行这个系统的,所以必须开启三个控制台窗口,一个运行服务器,一个运行客户端,还有一个运行RMIRegistry。
1、首先运行注册程序RMIRegistry:
&rmiregistry
2、在第二个控制台里,运行服务器CalculatorService,因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略。以下是对应安全策略的例子
permission java.security.AllPermission "", "";
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于更加关键性的应用,你必须指定更加详细安全策略。
现在为了运行服务端,需要除客户类(CalculatorClient.class)之外的所有的类文件。确认安全策略在policy.txt文件之后,使用如下命令来运行服务器。
& java -Djava.security.policy=policy.txt CalculatorServer
这个服务器就开始工作了,把接口的实现加载到内存等待客户端的联接。
3、现在切换到第三个控制台,启动客户端。
为了在其他的机器运行客户端程序需要一个远程接口(Calculator.class) 和一个stub(CalculatorImpl_Stub.class)。 使用如下命令运行客户端
prompt& java -Djava.security.policy=policy.txt CalculatorClient
RMI为真正面向对象的分布式计算提供了可靠的平台。 您可使用RMI连接到Java组件,或用其它语言编写的现有 的组件。随着Java在您的环境中所具备的重要性的日益 增加,您还可扩大Java的使用范围,并获得所有的好处 --无需移植、低维护成本和安全而保密的环境。RMI为您 提供了循序渐进地将Java扩展到您的系统所有部分的平 台,您可根据需要适时地添加Java服务器和客户机。只 要您添加了Java,那么它所有的好处都会随之而来。RMI 则使之更简单、保密和强大
spring实现RMI例子:
1、定义的接口
public interface UserManager {
public void setUserDao(UserDao dao);;
public AppUser getUser(String username);;
public List getUsers(AppUser user);;
public void saveUser(AppUser user); throws UserExistsE
public void removeUser(String username);;
public String checkLoginCookie(String value);;
public String createLoginCookie(String username);;
public void removeLoginCookies(String username);;
2、服务器端spring.xml配置:
&bean id="userManager" parent="txProxyTemplate"&
&property name="target"&
&bean class="demo.appfuse.service.impl.UserManagerImpl"&
&property name="userDao" ref="userDao" /&
&/property&
&!-- Override default transaction attributes b/c of LoginCookie methods --&
&property name="transactionAttributes"&
&prop key="save*"&
PROPAGATION_REQUIRED,-UserExistsException
&prop key="remove*"&PROPAGATION_REQUIRED&/prop&
&prop key="*LoginCookie"&PROPAGATION_REQUIRED&/prop&
&prop key="*"&PROPAGATION_REQUIRED,readOnly&/prop&
&/property&
&bean class="org.springframework.remoting.rmi.RmiServiceExporter"&
&property name="serviceName" value="userService"/&
&property name="service" ref="userManager"/&
&property name="serviceInterface" value="demo.appfuse.service.UserManager"/&
&!-- defaults to 1099 --&
&property name="registryPort" value="1199"/&
3、客户端spring xml配置
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"&
&bean id="userService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"&
&property name="serviceUrl" value="rmi://localhost:1199/userService"/&
&property name="serviceInterface" value="demo.appfuse.service.UserManager"/&
4、客户端调用方式:
userManager = (UserManager) applicationContext.getBean("userService");
接下来调用userManager接口就可以了。
浏览: 151336 次
来自: 上海
很全,收藏
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
你好,要定义的类和类型怎么写呢?
var areaCode ={11:&北京&quot ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'使用java的rmi进行通信,在客户端的Naming.lookup()方法抛出异常java.rmi.UnmarshalException!_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
使用java的rmi进行通信,在客户端的Naming.lookup()方法抛出异常java.rmi.UnmarshalException!
常为java.rmi.UnmarshalException: error
nested exception is:
java.lang.ClassNotFoundException
我有更好的答案
看提示应该是缺少类
你按提示找一下找不到的类 看看是不是存在
技术架构师
着就是传说中的空指针异常 就是Naming.lookup()
找不到相应的类
就是你这个类是独立的没事作用
报的应该是
本回答被网友采纳
为您推荐:
其他类似问题
rmi的相关知识
换一换
回答问题,赢新手礼包温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
package&com.robin.demo.rmi. &&&&import&java.rmi.R &&import&java.rmi.RemoteE &&&&public&interface&RmiSample&extends&Remote&{ &&&&&&public&int&sum(int&a,&int&b)&throws&RemoteE &&} &&&二、实现远程接口:&   远程对象实现类必须扩展远程对象java.rmi.UnicastRemoteObject类,并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为基础类构造函数可能会抛出 java.rmi.RemoteException,所以即使别无它用必须抛出java.rmi.RemoteException例外。&   以下是远程对象实现类的声明:java 代码package&com.robin.demo.rmi. &&&&import&java.rmi.RemoteE &&import&java.rmi.server.UnicastRemoteO &&&&import&com.robin.demo.rmi.interf.RmiS &&&&&&public&class&RmiSampleImpl&extends&UnicastRemoteObject&implements&RmiSample&{ &&&&&&/** &&&&&&*& &&&&&&*/&&&&&&private&static&final&long&serialVersionUID&=&3958461L; &&&&&&&&public&RmiSampleImpl()&throws&RemoteException&{ &&&&&&&&&&super(); &&&&&&} &&&&&&&&public&int&sum(int&a,&int&b)&throws&RemoteException&{ &&&&&&&&&&return&a&+&b; &&&&&&} &&&&}&&&  &   三、编写服务器类:&   包含 main 方法的类可以是实现类自身,也可以完全是另一个类。下面通过RmiSampleServer 来创建一个远程对象的实例,并通过java.rmi.registry.LocateRegistry类的createRegistry 方法从指定端口号启动注册服务程序,也可以通过执行 rmiregistry 命令启动注册服务程序,注册服务程序的缺省运行端口为 1099。必须将远程对象名字绑定到对远程对象的引用上: Naming.rebind("//localhost:8808/SAMPLE-SERVER" , Server);&   以下是服务器类的声明:java 代码package&com.robin.demo.rmi. &&&&import&java.net.MalformedURLE &&import&java.rmi.N &&import&java.rmi.RemoteE &&import&java.rmi.registry.LocateR &&&&import&com.robin.demo.rmi.impl.RmiSampleI &&&&&&public&class&RmiSampleServer&{ &&&&&&&&/** &&&&&&*&@param&args &&&&&&*/&&&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&&try{ &&&&&&&&&&&&&&LocateRegistry.createRegistry(8808); &&&&&&&&&&&&&&RmiSampleImpl&server=&new&RmiSampleImpl(); &&&&&&&&&&&&&&Naming.rebind("//localhost:8808/SAMPLE-SERVER"&,&server); &&&&&&&&&&}catch&(MalformedURLException&me){ &&&&&&&&&&&&&&System.out.println("Malformed&URL:&"&+&me.toString()); &&&&&&&&&&}catch(RemoteException&re){ &&&&&&&&&&&&&&System.out.println("Remote&Exception:&"+re.toString()); &&&&&&&&&&} &&&&&&} &&&&} &&  &   四、编写使用远程服务的客户机类:   客户机类的主要功能有两个,一是通过Naming.lookup方法来构造注册服务程序 stub 程序实例,二是调用服务器远程对象上的远程方法。&   以下是服务器类的声明:java 代码package&com.robin.demo.rmi. &&&&import&java.rmi.N &&import&java.rmi.RemoteE &&&&import&com.robin.demo.rmi.interf.RmiS &&&&&&public&class&RmiSampleClient&{ &&&&&&&&/** &&&&&&*&@param&args &&&&&&*/&&&&&&public&static&void&main(String[]&args)&{ &&&&&&&&&&try&{ &&&&&&&&&&&&&&String&url&=&"//localhost:8808/SAMPLE-SERVER"; &&&&&&&&&&&&&&RmiSample&RmiObject&=&(RmiSample)&Naming.lookup(url); &&&&&&&&&&&&&&System.out.println("&1&+&2&=&"&+&RmiObject.sum(1,&2)); &&&&&&&&&&}&catch&(RemoteException&rex)&{ &&&&&&&&&&&&&&System.out.println("Error&in&lookup:&"&+&rex.toString()); &&&&&&&&&&}&catch&(java.net.MalformedURLException&me)&{ &&&&&&&&&&&&&&System.out.println("Malformed&URL:&"&+&me.toString()); &&&&&&&&&&}&catch&(java.rmi.NotBoundException&ne)&{ &&&&&&&&&&&&&&System.out.println("NotBound:&"&+&ne.toString()); &&&&&&&&&&} &&&&&&&&} &&&&} &&   五、编译代码:   要编译 Java 源文件,请运行 javac 命令:   javac RmiSample.java RmiSampleImpl.java RmiSampleServer.java RmiSampleClient.java&  &   六、为远程对象实现创建根和干:&   要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。&   存根(Stub)是远程对象在客户端的代理,它将RMI调用传递给服务器端的骨架(Skeleton),后者负责将该调用传递给实际的远程方法输入如下:&   D:/RMI&rmic -d D:/RMI RmiSampleImpl 执行这个命令, 若rmic成功运行,RMI目录下就会多出两个新类: RmiSampleImpl_Stub.class RmiSampleImpl_Skel.class 它们分别对应的是存根(stub)和骨架(skeleton).&  &   七、运行代码:   运行服务端程序:在Windows下,输入下列命令,在后台启动RmiSampleServer程序:   D:/RMI&java RmiSampleServer&   运行客户端程序:&   D:/RMI&java RmiSampleClient&   客户端输出: 1 + 2 = 3&&修改上面内容:(因为上面服务端程序和客户端程序在同一台电脑上)服务器端程序不变客户端修改成&&String&url&=&"//服务端IP:8808/SAMPLE-SERVER";&&&另外特别说明:经测试验证了:客户端的接口(包括包名)要和服务端接口和包名相同才能通过来自:http://blog.csdn.net/huwei1991/article/details/8938055
阅读(1265)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'RMI学习以及深入讲解',
blogAbstract:'Java&RMI&(Remote&Method&Invocation&远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java&RMI&则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。RMI目前使用Java远程消息交换协议JRMP(Java&Remote&Messaging&Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java&RMI具有Java的\"Wri',
blogTag:'',
blogUrl:'blog/static/52',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:2,
permalink:'blog/static/52',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 java客户端服务端通信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信