利用Java语言实现数据报编程之单播
来源:网络 更新时间:2014-12-3
实际上,单播就是一个报文从源主机向另一个目标主机发送,接收目标只有一个。
首先,写收发器类DatagramRecvSender_s,这个类既要发送数据报又要接收数据报,发送一个文件夹中的所有图片,一张一张的进行,接收是在一个线程中进行,每收完一个文件,就激活一个事件,事件处理器处理这个事件。
类清单为:
packagerecmail.multiservice;
importJava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.SocketException;
importjava.net.SocketAddress;
importjava.net.UnknownHostException;
importjava.net.InetSocketAddress;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.net.InetAddress;
importjava.io.File;
importjava.util.Iterator;
publicclassDatagramRecvSender_sextendsDataSwapListenerAdapter
implementsRunnable{
publicstaticfinalintDatagramPort=10698;
privatejava.net.DatagramSocketroad;
privateInetAddressia;
DatagramPacketdp;
publicstaticfinalintDatagram_Length=8192;
privateDataPacketcdp;
privatebooleanishandling=true;
DataSwapEventdsevent;
/**
*这个构造器用于接收数据报.
*/
publicDatagramRecvSender_s(){
try{
System.out.println("recv...");
ia=InetAddress.getByName("localhost");//192.168.0.17"127.0.0.1"
dsevent=newDataSwapEvent(this);
SocketAddresssa=newInetSocketAddress(ia,
DatagramRecvSender_s.DatagramPort);
//至少要指定数据报接收端口,这是对接收端的唯一要求.当然如果主机是多址主机,需要road=newDatagramSocket(sa);
road=newDatagramSocket(DatagramRecvSender_s.DatagramPort);
System.out.println(road.isBound() "::" road.getBroadcast());
}
catch(SocketExceptionex){
ex.printStackTrace();
}
catch(Exceptionex1){
ex1.printStackTrace();
}
}
/**
*这个构造器用于发送数据报.
*@paramsendString
*/
publicDatagramRecvSender_s(Stringsend){
try{
System.out.println("startsending...");
ia=InetAddress.getByName("192.168.0.4");//"255.255.255.255""192.168.0.4""127.0.0.1"
dsevent=newDataSwapEvent(this);
SocketAddresssa=newInetSocketAddress(ia,
DatagramRecvSender_s.DatagramPort);
//如果需要接收数据报,就需要指定一个端口,否则不必指定.road=newDatagramSocket(DatagramRecvSender_s.DatagramPort-1);
road=newDatagramSocket();
System.out.println("isBound--" road.isBound() ":getBroadcast--" road.getBroadcast());
}
catch(SocketExceptionex){
ex.printStackTrace();
}
catch(UnknownHostExceptionex1){
ex1.printStackTrace();
}
}
publicvoidsendFile(Stringfile){
cdp=newDataPacket(file);
System.out.println(file);
Iteratorit=cdp.getDataPackets().iterator();
byte[]b;
while(it.hasNext()){
b=((DataEntry)it.next()).getByte();
//数据报是自包含的,自描述的数据,它的投递是由路由器执行的,路由器路由算法根据报文的目标地址选择适当的路由递送报文,
//所以数据报中要指定目标IP地址和目标主机处理端口.