Java中client与server的通信方式有几种

在CS开发中一般用到了以下几种技术:Socket网络编程、RPC(远程过程调用协议)java的RMI(远程方法调用),以及CORBA(通用对象请求代理架构)其中RPC是一种协议,CORBA是软件构建的一个标准,是跨语言和跨平台的。对于java中的通信方式主要是RMI和Socket,但是它们都需要序列化(Object Serializable)以便对象在网络间传输。

一、    关于RMI

   RMI:远程方法调用是java的一个分布式对象应用框架,能够实现灵活的可扩展的分布式通信。RMI允许对象存储在不同的地址空间和不同的JVM虚拟机上,所以它没有对象共享的全局变量,必须要对对象进行序列化(对象类必须实现Seralizable接口),序列化对象可以作为参数进行存取,它可以在不同的 JVM间传递。

        RMI为分布式计算提供了简单而直接的模型。它将java平台的安全性和可移植性优点带到了分布式计算中。

二、Socket网络编程

        Socket是基于“消息驱动逻辑”,它有一下特点:

1、         客户端与服务器都依靠消息进行通讯

2、         客户端与服务器都有一个消息派遣器,将消息投递给具体的message handler

3、         客户端与服务器都要利用 message handler时逻辑事务处理

       从技术本质上讲,它具有以下特点:

1、         基于TCP通讯协议

2、         应用程序需要提供对消息的序列化处理(具体来说是把消息序列化到网络流中)

3、         客户端与服务器需要事先协议好消息传第的格式

4、         由于是消息驱动逻辑,从本质上来说这种模式很难面向对象化

 三、RMI与Socket的比较

       1、RMI是面向对象的而Socket不是

       2、RMI是与语言相绑定的,比如说你的客户端是用java语言编写的,那么服务器端也要用java语言编写。Socket编程是独立与编程语言的,甚至独立与平台的,所以用Socket编程,客户端与服务器可以使用不同的语言或平台

       3、从网络协议来看,RMI与Socket属于不同的网络层次,Socket在TCP协议 之上,而RMI又在TCP协议之上定义了自己的协议,其传输层是采用的java的远程方法协议(JRMP)。可见在网络协议栈上,RMI应用位置更高一些。这也就是说,与Socket相比,RMI缺乏灵活性和可控性。但好处是带给开发者,方便快捷好用,并且你不需要知道消息是怎么被序列化的。

      4、最后一点也就是性能的比较,根据你应用的性能需求来决定你需要什么样的技术。两者在网络传输带宽上的比较,若传输2byte的有效数据,TCP将传输478byte的额外数据量,而RMI则要传输1645byte的额外数据量

以下是两者trace的结果:
TCP:

46037 > 12345[SYN] Seq=801611567 Ack=0 Win=5840 Len=0
12345 > 46037[SYN, ACK] Seq=266515894 Ack=801611568 Win=10136 Len=0
46037 > 12345[ACK] Seq=801611568 Ack=266515895 Win=5840 Len=0
12345 > 46037[PSH, ACK] Seq=266515895 Ack=801611568 Win=10136 Len=1
46037 > 12345[ACK] Seq=801611568 Ack=266515896 Win=5840 Len=0
12345 > 46037[FIN, PSH, ACK] Seq=266515896 Ack=801611568 Win=10136 Len=1
46037 > 12345[RST, ACK] Seq=801611568 Ack=266515898 Win=5840 Len=0
RMI:
42749 >rmiregistry [SYN, ECN, CWR]
Seq=3740552479Ack=0 Win=32767 Len=0
rmiregistry >42749 [SYN, ACK, ECN]
Seq=3749262223Ack=3740552480 Win=32767 Len=0
42749 >rmiregistry [ACK] Seq=3740552480 Ack=3749262224 Win=32767 Len=0
JRMI, Version: 2,StreamProtocol
rmiregistry >42749 [ACK] Seq=3749262224 Ack=3740552487 Win=32767 Len=0
JRMI, ProtocolAck
42749 > rmiregistry[ACK] Seq=3740552487 Ack=3749262240 Win=32767 Len=0
Continuation
rmiregistry >42749 [ACK] Seq=3749262240 Ack=3740552506 Win=32767 Len=0
JRMI, Call
rmiregistry >42749 [ACK] Seq=3749262240 Ack=3740552556 Win=32767 Len=0
JRMI, ReturnData
42749 > rmiregistry[ACK] Seq=3740552556 Ack=3749262442 Win=32767 Len=0
JRMI, Ping
JRMI, PingAck
42749 >rmiregistry [ACK] Seq=3740552557 Ack=3749262443 Win=32767 Len=0
JRMI, DgcAck
42749 >rmiregistry [FIN, ACK]
Seq=3740552572Ack=3749262443 Win=32767 Len=0
rmiregistry >42749 [FIN, ACK]
Seq=3749262443Ack=3740552573 Win=32767 Len=0
42749 >rmiregistry [ACK] Seq=3740552573 Ack=3749262444 Win=32767 Len=0

       总而言之,RMI是远程方法调用,强调的是“调用”,基于此我们想到的是:移动计算,远程控制,在网络间传递方法的参数和返回值,所以说当client与server间的数据量不是很大的时候用RMI是高效的,一旦你在client与server之间传递较大的极致的数据量,比如FTP,则还是用Socket比较好。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值