当前位置: 技术问答>java相关
关于 UDP Sockets 实现IP多点传送
来源: 互联网 发布时间:2015-09-11
本文导语: | IP 多点传送 MulticastSocket 类IP多点传送(multicast delivery)是针对点到点的传送和广播传送两种方式而言的,它是指在一定的组内对其成员进行的广播,是一种有限的广播。组中的某个成员发出的信息,组中的...
|
IP 多点传送 MulticastSocket 类IP多点传送(multicast delivery)是针对点到点的传送和广播传送两种方式而言的,它是指在一定的组内对其成员进行的广播,是一种有限的广播。组中的某个成员发出的信息,组中的其它所有成员都能收到。它是UDP Sockets的一个分支。
IP多点传送特别适合与高带宽的应用,例如在网络上发送视频和音频。随着网络带宽的不断提高和网络通讯质量的不断改善,IP多点传送还将广泛地被应用于网上聊天及网上会议,分布式数据存储,联机事务处理,交互式游戏等方面。另外,多点传送还可以被客户机用于在网络上寻找相应的服务器,客户机发送一个多点传送的请求,任何监听服务器都可以与客户机连接并开始一个事务。
UDP Socket基础
使用用户数据报协议(User Datagram Protocol,简称UDP)进行会话必须将信息装配成一定尺寸的小报文,当发送一条信息,接收方能否收到并返回信息永远是不确定的,如果无法收到返回信息,我们就无法确定我们发送的信息是否被接收——它可能在途中丢失,接收者返回的响应信息也可能丢失,另外,接收者也可能忽略我们的信息,因此,UDP被描述为不可靠的、无连接的和面向消息的。
创建UDP sockets非常象创建一个邮箱。邮箱是使用地址来识别的,但是,我们不需要为每个发送信息的人构造一个新的邮箱,可以在含有发送信息的明信片上写上目的地址,将其放在邮箱中并发送出去。接收者可能会长久的等待,直到含有信息的明信片到达它的邮箱,而明信片上标识了发送者的返回地址。
IP多点传送的原理
为了支持IP多点传送,某些范围的IP地址被单独留出专门用于这个目的,这些IP地址是D类地址,其地址的最高四比特的位模式为“1110”,即IP地址的范围在224.0.0.0和239.255.255.255之间。它们中的每一个IP地址都可以被引用作为一个多点传送组,任何以该IP地址编址的IP报文将被该组中的其它所有机器接收,也就是说,一个IP地址就相当于一个邮箱。另外,组中的成员是动态的并随时间而改变。
对于IP多点传送,网间网组管理协议(Internet Group Management Protocol,简称IGMP),用于管理多点传送组中的成员。支持多点传送的路由可以使用IGMP决定本地的机器是否赞成加入某个组,一个多点传送路由可以决定是否转发一个多点传送报文。
影响多点传送报文的一个重要参数是time-to-live(TTL)。TTL用于描述发送者希望传送的信息能通过多少不同的网络。当报文被路由器转发,报文中的TTL将减一,当TTL为零时,报文将不再向前发送。
在实际使用中,我们必须注意下面几点:
1.这些IP地址只能作为信宿地址使用,绝对不能出现在任何信源地址域中,也不能出现在源路径或记录路径选项中:
2.由于IP多点传送是一对多的传送,因此,不能利用差错与控制报文协议(Internet Control Message Protocol,简称ICMP)产生出错报文。
3.发送一个信息到一个组,发送主机可以不是组中的成员;
4.一些组被Internet Assigned Numbers Authority(IANA)分配,保留用于特殊的目的,详情参见:ftp://ftp.internic.net/rfc/rfc1700.txt。另外,避免使用一些保留组,从224.0.0.0到224.0.0.225仅限于本地子网使用。建议在224.0.1.27和224.0.1.225之间任意选取一个IP地址。
5.如果我们选取的组已经被使用,与其他机器的通讯将会混乱,一旦发生,可以退出应用,试试其他的地址。
6.当一个机器加入一个多点传送组,它将开始接收该IP多点传送地址的信息。如果多点传送报文分发到网络上,任何监听该信息的机器都会有机会接收它。对于IP多点传送,没有一个机制对相同网络上的机器能否加入该多点传送组加以限制。因此,安全性是我们必须考虑的问题之一。
7.选择的TTL参数应尽可能小。一个大的TTL值会不必要地占用Internet带宽。此外,还可能破坏不同区域使用相同组的其它的多点传送通讯。
Java中与IP多点传送相关的类
java.net包中含有UDP通讯所需要的工具,其中包括IP多点传送。
DatagramPacket类
我们可以使用DatagramPacket类创建一个用于发送的数据报,而当接收UDP数据报时,可以使用DatagramPacket类读取数据报中的数据,发送者及其它信息。
为了创建一个数据报并发送到远地系统,可以使用下面的构造器:
Public DatagramPacket(byte ibuf,int length,InetAddress iaddr,int iport,);
ibuf是编码信息数据的字节数组,它的长度length就是数据报放在其中的字节数组的长度,iaddr是一个InetAddress对象,存储着接收方的主机名和IP地址等信息,iport标识数据报发送到接收主机的端口。
为了接收数据报,必须使用DatagramPacket构造器,其原型为:public DatagramPacket(byte ibuf,int ilength);ibuf是指接收的数据报的数据部分, ilength是该部分数据的长度。如果 ilength 小于机器接收的UDP数据报的尺寸,多余的字节将被Java忽略。
另外,类中有一些方法(method)可以让我们得到一些相关的信息:
public int getLength(); //得到数据报中数据块的字节尺寸
public bytegetData();//得到接收数据报中的数据
public InetAddress getAddress(); //为发送者提供一个 InetAddress对象
public int getPort(); //得到UDP端口
值得注意的是,TCP sockets的编程中,我们无须将传送的数据分块,然而,当我们创建一个基于UDP的网络通讯应用程序时,必须创建一套方法,在运行时刻决定需分割的数据报的长度。对于TCP/IP,最大的数据报可以含有65507字节的数据,然而,主机仅能接收最多548字节的数据,支持8192字节的大数据报的平台是利用IP层对数据报进行分割的。如果在传送期间,任何含有IP报文的一个数据块丢失,都会造成整个UDP数据报的丢失,因此,我们在确定应用中数据报尺寸时,对其尺寸的合理性一定要谨慎。
下面就是分割数据的一个例子:
//循环地从输入流input中读一行数据
while((nextLine=input.readLine())!=null){
//定义一个空数据报,其尺寸为512
mcastBuffer=new byte[512];
//如果读入的数据的长度大于定义的数据报的长度,
//则使用定义的长度,否则使用读入数据的长度
if(nextLine.length()>mcastBuffer.length){
sendLength=mcastBuffer.length;
}else {
sendLenth=nextLine.length();
}
//将读入的数据转换为byte类型
lineData=nextLine.getBytes();
//将数据复制到用于创建数据报的byte数组
for(int i=0;i mcastBuffer[i]=lineData[i];
}
……创建数据报,发送或接收……
}
MulticastSocket类
Java的 MulticastSocket类是实施IP多点传送网络特征的关键,它允许我们使用多点传送IP发送或接收UDP数据报。 MulticastSocket的构造器为:
public MulticastSocket () throws IOException; //创建一个多点传送socket
public MulticastSocket(int port)throws IOException;//在指定端口创建一个多点传送socket
另外,类中其它常用的方法有:
public void joinGroup(InetAddress mcastaddr)throws IOException{} //加入多点传送组
public void leaveGroup(InetAddress mcastaddr)throws IOException{} //离开多点传送组
public synchronized void send(DatagramPacket p,byte ttl) throws IOException{} //发送数据报
public synchronized void receive(DatagramPacket p,byte ttl) throws IOException{} //接收数据报
创建一个DatagramPacket对象之后,我们必须相应地创建一个 MulticastSocket对象,这样,数据报就可以使用send()方法发送了。下面的代码演示了如何创建 MulticastSocket、发送和接收IP多点传送数据报:
int multiPort=2345; //定义端口号,非超级用户应使用1024以上的端口
int ttl=1; //设定TTL值
InetAddress multiAddr=InetAddress.getByName(″224.0.1.100″); //设定多点传送IP
byteSmultiBytes={'H','e','1','1','O'}; //定义一个内容为“Hello”的数据报
//创建多点传送数据报
DatagramPacket SmultiDatagram new Datagram Packet(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
MulticastSocket multiSocket=new MulticastSocket(); //创建多点传送socket
multiSocket.send(SmultiDatagram,ttl); //发送数据报(不加入到组中)
……
byteRmultiBytes=new byte[256]; //定义一个空数据报,长度为256字节
//创建接收数据报
DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes,RmultiBytes.length);
multiSocket.joinGroup(multiAddr); //加入到多点传送组中
multiSocket.receive(RmultiDatagram);//接收UDP数据报
……
multiSocket.leaveGroup(multiAddr); //离开多点传送组
multiSocket.close(); //关闭多点传送 socket
当调用joinGroup()方法时,机器将关注沿着网络传送属于特定多点传送组的任何IP报文,也就是说,机器拥有了一个邮箱。主机还应使用IGMP相应地报告组的使用。对于多IP地址的机器,应配置数据报发送的接口:setInterface(oneOfMyLocalAddrs);
在DatagramSocket中没有类似 setSo Timeout()的方法设置超时。
IP多点传送应用程序的开发流程
由于IP多点传送主要用于同组中成员的交流,因此,应用程序的开发流程大体如下:
1.创建一个需发送的按规定编址的数据报DatagramPacket;
2.建立一个用于发送和接收的MulticastSocket;
3.加入一个多点传送组;
4.将数据报放入MulticastSocket中传送出去;
5.等待从MulticastSocket接收数据报;
6.解码数据报提取信息;
7.根据得到的信息作出回应;
IP多点传送特别适合与高带宽的应用,例如在网络上发送视频和音频。随着网络带宽的不断提高和网络通讯质量的不断改善,IP多点传送还将广泛地被应用于网上聊天及网上会议,分布式数据存储,联机事务处理,交互式游戏等方面。另外,多点传送还可以被客户机用于在网络上寻找相应的服务器,客户机发送一个多点传送的请求,任何监听服务器都可以与客户机连接并开始一个事务。
UDP Socket基础
使用用户数据报协议(User Datagram Protocol,简称UDP)进行会话必须将信息装配成一定尺寸的小报文,当发送一条信息,接收方能否收到并返回信息永远是不确定的,如果无法收到返回信息,我们就无法确定我们发送的信息是否被接收——它可能在途中丢失,接收者返回的响应信息也可能丢失,另外,接收者也可能忽略我们的信息,因此,UDP被描述为不可靠的、无连接的和面向消息的。
创建UDP sockets非常象创建一个邮箱。邮箱是使用地址来识别的,但是,我们不需要为每个发送信息的人构造一个新的邮箱,可以在含有发送信息的明信片上写上目的地址,将其放在邮箱中并发送出去。接收者可能会长久的等待,直到含有信息的明信片到达它的邮箱,而明信片上标识了发送者的返回地址。
IP多点传送的原理
为了支持IP多点传送,某些范围的IP地址被单独留出专门用于这个目的,这些IP地址是D类地址,其地址的最高四比特的位模式为“1110”,即IP地址的范围在224.0.0.0和239.255.255.255之间。它们中的每一个IP地址都可以被引用作为一个多点传送组,任何以该IP地址编址的IP报文将被该组中的其它所有机器接收,也就是说,一个IP地址就相当于一个邮箱。另外,组中的成员是动态的并随时间而改变。
对于IP多点传送,网间网组管理协议(Internet Group Management Protocol,简称IGMP),用于管理多点传送组中的成员。支持多点传送的路由可以使用IGMP决定本地的机器是否赞成加入某个组,一个多点传送路由可以决定是否转发一个多点传送报文。
影响多点传送报文的一个重要参数是time-to-live(TTL)。TTL用于描述发送者希望传送的信息能通过多少不同的网络。当报文被路由器转发,报文中的TTL将减一,当TTL为零时,报文将不再向前发送。
在实际使用中,我们必须注意下面几点:
1.这些IP地址只能作为信宿地址使用,绝对不能出现在任何信源地址域中,也不能出现在源路径或记录路径选项中:
2.由于IP多点传送是一对多的传送,因此,不能利用差错与控制报文协议(Internet Control Message Protocol,简称ICMP)产生出错报文。
3.发送一个信息到一个组,发送主机可以不是组中的成员;
4.一些组被Internet Assigned Numbers Authority(IANA)分配,保留用于特殊的目的,详情参见:ftp://ftp.internic.net/rfc/rfc1700.txt。另外,避免使用一些保留组,从224.0.0.0到224.0.0.225仅限于本地子网使用。建议在224.0.1.27和224.0.1.225之间任意选取一个IP地址。
5.如果我们选取的组已经被使用,与其他机器的通讯将会混乱,一旦发生,可以退出应用,试试其他的地址。
6.当一个机器加入一个多点传送组,它将开始接收该IP多点传送地址的信息。如果多点传送报文分发到网络上,任何监听该信息的机器都会有机会接收它。对于IP多点传送,没有一个机制对相同网络上的机器能否加入该多点传送组加以限制。因此,安全性是我们必须考虑的问题之一。
7.选择的TTL参数应尽可能小。一个大的TTL值会不必要地占用Internet带宽。此外,还可能破坏不同区域使用相同组的其它的多点传送通讯。
Java中与IP多点传送相关的类
java.net包中含有UDP通讯所需要的工具,其中包括IP多点传送。
DatagramPacket类
我们可以使用DatagramPacket类创建一个用于发送的数据报,而当接收UDP数据报时,可以使用DatagramPacket类读取数据报中的数据,发送者及其它信息。
为了创建一个数据报并发送到远地系统,可以使用下面的构造器:
Public DatagramPacket(byte ibuf,int length,InetAddress iaddr,int iport,);
ibuf是编码信息数据的字节数组,它的长度length就是数据报放在其中的字节数组的长度,iaddr是一个InetAddress对象,存储着接收方的主机名和IP地址等信息,iport标识数据报发送到接收主机的端口。
为了接收数据报,必须使用DatagramPacket构造器,其原型为:public DatagramPacket(byte ibuf,int ilength);ibuf是指接收的数据报的数据部分, ilength是该部分数据的长度。如果 ilength 小于机器接收的UDP数据报的尺寸,多余的字节将被Java忽略。
另外,类中有一些方法(method)可以让我们得到一些相关的信息:
public int getLength(); //得到数据报中数据块的字节尺寸
public bytegetData();//得到接收数据报中的数据
public InetAddress getAddress(); //为发送者提供一个 InetAddress对象
public int getPort(); //得到UDP端口
值得注意的是,TCP sockets的编程中,我们无须将传送的数据分块,然而,当我们创建一个基于UDP的网络通讯应用程序时,必须创建一套方法,在运行时刻决定需分割的数据报的长度。对于TCP/IP,最大的数据报可以含有65507字节的数据,然而,主机仅能接收最多548字节的数据,支持8192字节的大数据报的平台是利用IP层对数据报进行分割的。如果在传送期间,任何含有IP报文的一个数据块丢失,都会造成整个UDP数据报的丢失,因此,我们在确定应用中数据报尺寸时,对其尺寸的合理性一定要谨慎。
下面就是分割数据的一个例子:
//循环地从输入流input中读一行数据
while((nextLine=input.readLine())!=null){
//定义一个空数据报,其尺寸为512
mcastBuffer=new byte[512];
//如果读入的数据的长度大于定义的数据报的长度,
//则使用定义的长度,否则使用读入数据的长度
if(nextLine.length()>mcastBuffer.length){
sendLength=mcastBuffer.length;
}else {
sendLenth=nextLine.length();
}
//将读入的数据转换为byte类型
lineData=nextLine.getBytes();
//将数据复制到用于创建数据报的byte数组
for(int i=0;i mcastBuffer[i]=lineData[i];
}
……创建数据报,发送或接收……
}
MulticastSocket类
Java的 MulticastSocket类是实施IP多点传送网络特征的关键,它允许我们使用多点传送IP发送或接收UDP数据报。 MulticastSocket的构造器为:
public MulticastSocket () throws IOException; //创建一个多点传送socket
public MulticastSocket(int port)throws IOException;//在指定端口创建一个多点传送socket
另外,类中其它常用的方法有:
public void joinGroup(InetAddress mcastaddr)throws IOException{} //加入多点传送组
public void leaveGroup(InetAddress mcastaddr)throws IOException{} //离开多点传送组
public synchronized void send(DatagramPacket p,byte ttl) throws IOException{} //发送数据报
public synchronized void receive(DatagramPacket p,byte ttl) throws IOException{} //接收数据报
创建一个DatagramPacket对象之后,我们必须相应地创建一个 MulticastSocket对象,这样,数据报就可以使用send()方法发送了。下面的代码演示了如何创建 MulticastSocket、发送和接收IP多点传送数据报:
int multiPort=2345; //定义端口号,非超级用户应使用1024以上的端口
int ttl=1; //设定TTL值
InetAddress multiAddr=InetAddress.getByName(″224.0.1.100″); //设定多点传送IP
byteSmultiBytes={'H','e','1','1','O'}; //定义一个内容为“Hello”的数据报
//创建多点传送数据报
DatagramPacket SmultiDatagram new Datagram Packet(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
MulticastSocket multiSocket=new MulticastSocket(); //创建多点传送socket
multiSocket.send(SmultiDatagram,ttl); //发送数据报(不加入到组中)
……
byteRmultiBytes=new byte[256]; //定义一个空数据报,长度为256字节
//创建接收数据报
DatagramPacket RmultiDatagram=new DatagramPacket(RmultiBytes,RmultiBytes.length);
multiSocket.joinGroup(multiAddr); //加入到多点传送组中
multiSocket.receive(RmultiDatagram);//接收UDP数据报
……
multiSocket.leaveGroup(multiAddr); //离开多点传送组
multiSocket.close(); //关闭多点传送 socket
当调用joinGroup()方法时,机器将关注沿着网络传送属于特定多点传送组的任何IP报文,也就是说,机器拥有了一个邮箱。主机还应使用IGMP相应地报告组的使用。对于多IP地址的机器,应配置数据报发送的接口:setInterface(oneOfMyLocalAddrs);
在DatagramSocket中没有类似 setSo Timeout()的方法设置超时。
IP多点传送应用程序的开发流程
由于IP多点传送主要用于同组中成员的交流,因此,应用程序的开发流程大体如下:
1.创建一个需发送的按规定编址的数据报DatagramPacket;
2.建立一个用于发送和接收的MulticastSocket;
3.加入一个多点传送组;
4.将数据报放入MulticastSocket中传送出去;
5.等待从MulticastSocket接收数据报;
6.解码数据报提取信息;
7.根据得到的信息作出回应;
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。