|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。编程|数据UDP播送,实践上是很复杂的,了解IP编址计划,就了解甚么是播送,良多文章称为多播,我以为称为播送对照好,由于多播是对播送和组播的泛指,在Java程序中处置天然是分歧的了,本文和下一篇只为夸大观点.
正如后面所说,播送地点包含定向播送地点和无限播送地点,TCP/IP协定划定,这两种地点只能在当地收集中呈现,路由器实行了这个划定,不把方针地点为播送地点的报文转发到别的收集,而组播就分歧,下一篇先容组播编程.
这个播送的程序能够复杂的经由过程修正单播程序中的报文的方针地点成播送地点便可成为播送程序.
packagerecmail.multiservice;
importjava.net.DatagramSocket;
importjava.net.*;
importjava.io.*;
importjava.util.ArrayList;
importjava.util.Iterator;
publicclassDatagramRecvSender_bextendsDataSwapListenerAdapter
implementsRunnable{
publicstaticfinalintDatagramPort=10698;
privatejava.net.DatagramSocketroad;
privateInetAddressia;
DatagramPacketdp;
publicstaticfinalintDatagram_Length=8192;
privateDataPacketcdp;
privatebooleanishandling=true;
DataSwapEventdsevent;
/**
*这个机关器用于吸收数据报.
*/
publicDatagramRecvSender_b(){
try{
System.out.println("recv...");
dsevent=newDataSwapEvent(this);
SocketAddresssa=newInetSocketAddress(
DatagramRecvSender_b.DatagramPort);
//最少要指定命据报吸收端口,这是对吸收真个独一请求.固然假如主机是多址主机,必要road=newDatagramSocket(sa);
road=newDatagramSocket(DatagramRecvSender_b.DatagramPort);
System.out.println(road.isBound()+"::"+road.getBroadcast());
}
catch(SocketExceptionex){
ex.printStackTrace();
}
catch(Exceptionex1){
ex1.printStackTrace();
}
}
/**
*这个机关器用于发送数据报.
*@paramsendString
*/
publicDatagramRecvSender_b(Stringsend){
try{
System.out.println("send...");
//这个类能够盘算当地网的定向播送地点.
BroadcastAddrinfo=newBroadcastAddr();
info.setNetmask("255.255.255.0");
info.setNetaddr("192.168.0.106");
info.execCalc();
ia=InetAddress.getByName(info.getNetbroadcastaddr());//"255.255.255.255"
dsevent=newDataSwapEvent(this);
SocketAddresssa=newInetSocketAddress(ia,
DatagramRecvSender_b.DatagramPort);
//假如必要吸收数据报,就必要指定一个端口,不然不用指定.road=newDatagramSocket(DatagramRecvSender_s.DatagramPort-1);
road=newDatagramSocket();
//DatagramSocket类实例的getBroadcast()前往true,即该类的播送属性缺省设置是true,就是使能的.
//road.setBroadcast(true);能够测试一下当实行了road.setBroadcast(false)后会呈现甚么情况.
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();
DatagramPacketdp=newDatagramPacket(b,0,b.length,ia,DatagramRecvSender_b.DatagramPort);
try{
Thread.sleep(100);
if(dp==null)
continue;
road.send(dp);
}
catch(Exceptionex){
ex.printStackTrace();
}
}
}
publicbooleanisHandling(){
returnishandling;
}
publicvoidisHandling(booleanishand){
ishandling=ishand;
}
publicvoidrun(){
byte[]buffer=newbyte[DataPacket.DataSwapSize];
DatagramPacketpacket=newDatagramPacket(buffer,buffer.length);
DataPacketdp=newDataPacket();
while(ishandling){
packet.setLength(buffer.length);
System.out.println("wait..");
try{
road.receive(packet);
dp.Add(packet.getData());
if(dp.isFull()){
dsevent.setImage(dp.Gereratedata());
this.processRecvFinishedEvent(dsevent);
dp=newDataPacket();
}
}
catch(IOExceptionex){
System.out.println(ex);
}
}
}
publicstaticvoidmain(String[]args){
Stringfile[];
ArrayListal=newArrayList();
//换成你呆板上的图像文件夹
Stringpath="E:
ature";
Filef=newFile(path);
file=f.list();
DatagramRecvSender_bdgrs=newDatagramRecvSender_b("");
for(intj=0;j<1000;j++)
for(inti=0;i<file.length;i++){
try{
Thread.sleep(2000);
}
catch(InterruptedExceptionex){
}
if(file[i].endsWith("jpg")||file[i].endsWith("bmp"))
dgrs.sendFile(path+file[i]);
}
}
}
publicstaticvoidmain(String[]args){
Stringfile[];
ArrayListal=newArrayList();
Stringpath="E:
ature";//naturemzip
Filef=newFile(path);
file=f.list();
DatagramRecvSender_bdgrs=newDatagramRecvSender_b("");
for(intj=0;j<1000;j++)
for(inti=0;i<file.length;i++){
try{
Thread.sleep(2000);
}
catch(InterruptedExceptionex){
}
if(file[i].endsWith("jpg")||file[i].endsWith("bmp"))
//System.out.println(file[i]);
//al.add(path+file[i]);
dgrs.sendFile(path+file[i]);
}
}
}
吸收端显现界面和单播不异,修要修正的只要一句:
在类testDual的main办法中,把DatagramRecvSender_s改成DatagramRecvSender_b便可,把吸收端放到你的局域网上的几个呆板上同时运转,你应当会看到不休显现的图像.
publicstaticvoidmain(String[]args){
testDualtest=newtestDual();
test.initmain();
test.go();
DatagramRecvSender_sdgrs=newDatagramRecvSender_s();
dgrs.addDataSwapListener(test);
Threadthread=newThread(dgrs,"test");
thread.start();
}
下一篇先容组播编程.
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 |
|