java通讯机制

1、Ip网络数据传输方式有3中:单播、组播和广播:

单播(unicast)传输:在发送者和每个接收者之间实现点对点网络连接。如果一台发送者给同时给多个接收者发送相同的数据,也必须复制多份相同的数据包。如果有大量主机希望获得数据包的同一份copy,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需要增加硬件和带宽。

组播(Multicase)传输:在发送者和每个接收者之间实现点对点网络连接。如果一个发送者同时给多个接收者传输同样的数据,也只需要复制一份相同的数据包。它提供了数据传送效率,减少骨干网出现阻塞的可能。

广播(Broadcast)传输:是指在ip子网内广播数据包,所有子网内部的主机都将收到这些数据包。广播意味着网络向每个主机都投递一份数据包,不论这些主机是否乐意接收这些数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制网络传输。

 

1、网络通讯

1)协议。Ip网络数据传输方式有3中:单播、组播和广播:

单播(unicast)传输:在发送者和每个接收者之间实现点对点网络连接。如果一台发送者给同时给多个接收者发送相同的数据,也必须复制多份相同的数据包。如果有大量主机希望获得数据包的同一份copy,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需要增加硬件和带宽。

组播(Multicase)传输:在发送者和每个接收者之间实现点对点网络连接。如果一个发送者同时给多个接收者传输同样的数据,也只需要复制一份相同的数据包。它提供了数据传送效率,减少骨干网出现阻塞的可能。

广播(Broadcast)传输:是指在ip子网内广播数据包,所有子网内部的主机都将收到这些数据包。广播意味着网络向每个主机都投递一份数据包,不论这些主机是否乐意接收这些数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制网络传输。

2BIO tcp/ip

tcop/ip协议基础上的BIO通讯,最好采取定长报文格式,或限定报文的最大长度。

需要注意以下方法的使用

byte[] buffer = new byte[1024];

int len = -1;

while((len = input.read(buffer)) != -1){

  doSomething();

}

output.writer(“ok”);

在上述的情况中,使用读文件留最常用的方法,判断是否读取到-1来判断是否结束,这样即使流的写如者使用flush方法,read也永远不会读到-1的返回值。故writer方法永远也不会执行。

可以使用的方法是,把BIO通过设置超时时间变成非阻塞IO,然后对超时的异常做处理:

socket.setSoTimeout(1000);

byte[] buffer = new byte[1024];

int len = -1;

try{

  while((len = input.read(buffer)) != -1){

    doSomething();

  }

} catch(Exception ex){}

output.writer(“ok”);

这样,在系统在1秒钟之后就会自动超时结束,抛出异常,由于对异常没有做抛出的处理,因此在1秒后,会对socket回写ok字符串。

ServerSocket同样也存在setSoTimeout的方法,只是这个方法是对accept()的阻塞接受转换为超时异常的形式。

3NIO Blocking IO

使用socketChannel读取和写入ByteBuffer时,由于是非阻塞的,所以极有可能读取到的信息是不全的,使用如下方式:

ByteBuffer read=ByteBuffer.allocate(len);

ByteBuffer write=ByteBuffer.wrap(“write to server!”.getByte());

int total=0;

while(total<len){

  if(write.hasRemainning()){

    channel.write(write);

  }

  total += channel.read(read);

}

new String(read, 0, total);

 

选择器

可选择通道channel实用regiest()方法注册一个选择器。Selector的获取是通过调用selector的静态方法open实现

Selector selector = Selector.open();

Channel.regiest(selector,SelectorKey.OP_READ);

轻易不要实用OP_WRITE通道的interst属性,此种方式容易造成cpu实用率100%

 

4Java 远程调用框架RPC框架简单介绍

1)RMI

服务器端:写接口(继承Remote,并且每个方法都抛出RemoteException)

Server方法:

UnicastRemoteObject.exportObject(obj,port);

Registry registry=LocateRegistry.createRegistry(1099);

registry.rebind(name,obj);

客户端:

Registry registry=LocateRegistry.getRegistry(local,port);

registry.lookup(name);

2)WebService

服务端:

webserviceclass的类上加注释

@WebService(name=”business”,serviceName=”businessservice”,targetNamespace=”http://org/client”)

在主类中实用endpoint发布信息

Endpoint.publish(url,obj);

对应关系:

在报文地址中存在一个service,名称对应class注解的serviceName字段。在service中存在porttype,对应class注解的name属性,EndPoint中的urlwebserviceporttypesoap报文的实用地址。

客户端:

使用wsimport –keep http://ip:port/business.wsdl获取客户端存根。然后通过service接口的方法使用。

自己写:

接口

接口注解

@WebService(name=”business”,targetNamespace=”http://org/client”)

@SOAPBing(Style=SOAPBing.style.RPC)

 

并对每个方法做注解

@WebMethod

@WebResult(partName=”return”)

Public String hello(@webParam(name=”arg0”,partName=”arg0”)int arg0);

编写service类,继承自service

构造方法使用super(new Url(wsdl,new Qname()))

getPort(new Qname,Business.class)

使用接口business的方法

 

无论采用RMI还是WebService,都封装了通讯的细节,因此在实用上也更加简单,但在对通讯的细节做调优比较复杂。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值