1、Ip网络数据传输方式有3中:单播、组播和广播:
单播(unicast)传输:在发送者和每个接收者之间实现点对点网络连接。如果一台发送者给同时给多个接收者发送相同的数据,也必须复制多份相同的数据包。如果有大量主机希望获得数据包的同一份copy,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需要增加硬件和带宽。
组播(Multicase)传输:在发送者和每个接收者之间实现点对点网络连接。如果一个发送者同时给多个接收者传输同样的数据,也只需要复制一份相同的数据包。它提供了数据传送效率,减少骨干网出现阻塞的可能。
广播(Broadcast)传输:是指在ip子网内广播数据包,所有子网内部的主机都将收到这些数据包。广播意味着网络向每个主机都投递一份数据包,不论这些主机是否乐意接收这些数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制网络传输。
1、网络通讯
1)协议。Ip网络数据传输方式有3中:单播、组播和广播:
单播(unicast)传输:在发送者和每个接收者之间实现点对点网络连接。如果一台发送者给同时给多个接收者发送相同的数据,也必须复制多份相同的数据包。如果有大量主机希望获得数据包的同一份copy,将导致发送者负担沉重、延迟长、网络拥塞;为保证一定的服务质量需要增加硬件和带宽。
组播(Multicase)传输:在发送者和每个接收者之间实现点对点网络连接。如果一个发送者同时给多个接收者传输同样的数据,也只需要复制一份相同的数据包。它提供了数据传送效率,减少骨干网出现阻塞的可能。
广播(Broadcast)传输:是指在ip子网内广播数据包,所有子网内部的主机都将收到这些数据包。广播意味着网络向每个主机都投递一份数据包,不论这些主机是否乐意接收这些数据包。所以广播的使用范围非常小,只在本地子网内有效,通过路由器和网络设备控制网络传输。
2、BIO 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()的阻塞接受转换为超时异常的形式。
3、NIO 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%
4、Java 远程调用框架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
服务端:
在webservice的class的类上加注释
@WebService(name=”business”,serviceName=”businessservice”,targetNamespace=”http://org/client”)
在主类中实用endpoint发布信息
Endpoint.publish(url,obj);
对应关系:
在报文地址中存在一个service,名称对应class注解的serviceName字段。在service中存在porttype,对应class注解的name属性,EndPoint中的url是webservice的porttype的soap报文的实用地址。
客户端:
使用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,都封装了通讯的细节,因此在实用上也更加简单,但在对通讯的细节做调优比较复杂。