|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
前些天,在CSDN上看到了一个消息,说是ASP.NETAJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。DatagramPacket类
我们可使用DatagramPacket类创立一个用于发送的数据报,而当吸收UDP数据报时,可使用DatagramPacket类读取数据报中的数据,发送者及别的信息。
为了创立一个数据报并发送到远地体系,可使用上面的机关器:
PublicDatagramPacket(byteibuf,intlength,InetAddressiaddr,intiport,);
ibuf是编码信息数据的字节数组,它的长度length就是数据报放在个中的字节数组的长度,iaddr是一个InetAddress对象,存储着吸收方的主机名和IP地点等信息,iport标识数据报发送到吸收主机的端口。
为了吸收数据报,必需利用DatagramPacket机关器,其原型为:publicDatagramPacket(byteibuf,intilength);ibuf是指吸收的数据报的数据部分,ilength是该部分数据的长度。假如ilength小于呆板吸收的UDP数据报的尺寸,过剩的字节将被Java疏忽。
别的,类中有一些办法(method)可让我们失掉一些相干的信息:
publicintgetLength(); //失掉数据报中数据块的字节尺寸
publicbytegetData();//失掉吸收数据报中的数据
publicInetAddressgetAddress(); //为发送者供应一个InetAddress对象
publicintgetPort(); //失掉UDP端口
值得注重的是,TCPsockets的编程中,我们不必将传送的数据分块,但是,当我们创立一个基于UDP的收集通信使用程序时,必需创立一套办法,在运转时候决意需支解的数据报的长度。关于TCP/IP,最年夜的数据报能够含有65507字节的数据,但是,主机仅能吸收最多548字节的数据,撑持8192字节的年夜数据报的平台是使用IP层对数据报举行支解的。假如在传送时代,任何含有IP报文的一个数据块丧失,城市形成全部UDP数据报的丧失,因而,我们在断定使用中数据报尺寸时,对其尺寸的公道性必定要审慎。
上面就是支解数据的一个例子:
//轮回地从输出流input中读一行数据
while((nextLine=input.readLine())!=null){
//界说一个空数据报,其尺寸为512
mcastBuffer=newbyte[512];
//假如读进的数据的长度年夜于界说的数据报的长度,
//则利用界说的长度,不然利用读进数据的长度
if(nextLine.length()>mcastBuffer.length){
sendLength=mcastBuffer.length;
}else{
sendLenth=nextLine.length();
}
//将读进的数据转换为byte范例
lineData=nextLine.getBytes();
//将数据复制到用于创立数据报的byte数组
for(inti=0;i<sendLength;i++){
mcastBuffer[i]=lineData[i];
}
……创立数据报,发送或吸收……
}
MulticastSocket类
Java的MulticastSocket类是实行IP多点传送收集特性的关头,它同意我们利用多点传送IP发送或吸收UDP数据报。MulticastSocket的机关器为:
publicMulticastSocket()throwsIOException; //创立一个多点传送socket
publicMulticastSocket(intport)throwsIOException;//在指定端口创立一个多点传送socket
别的,类中别的经常使用的办法有:
publicvoidjoinGroup(InetAddressmcastaddr)throwsIOException{}//到场多点传送组
publicvoidleaveGroup(InetAddressmcastaddr)throwsIOException{}//分开多点传送组
publicsynchronizedvoidsend(DatagramPacketp,bytettl)throwsIOException{} //发送数据报
publicsynchronizedvoidreceive(DatagramPacketp,bytettl)throwsIOException{} //吸收数据报
创立一个DatagramPacket对象以后,我们必需响应地创立一个MulticastSocket对象,如许,数据报就能够利用send()办法发送了。上面的代码演示了怎样创立MulticastSocket、发送和吸收IP多点传送数据报:
intmultiPort=2345; //界说端标语,非超等用户应利用1024以上的端口
intttl=1; //设定TTL值
InetAddressmultiAddr=InetAddress.getByName(″224.0.1.100″); //设定多点传送IP
byteSmultiBytes={H,e,1,1,O};//界说一个内容为“Hello”的数据报
//创立多点传送数据报
DatagramPacketSmultiDatagramnewDatagramPacket(SmultiBytes,SmultiBytes,length,multiAddr,multiPort);
MulticastSocketmultiSocket=newMulticastSocket(); //创立多点传送socket
multiSocket.send(SmultiDatagram,ttl); //发送数据报(不到场到组中)
……
byteRmultiBytes=newbyte[256]; //界说一个空数据报,长度为256字节
//创立吸收数据报
DatagramPacketRmultiDatagram=newDatagramPacket(RmultiBytes,RmultiBytes.length);
multiSocket.joinGroup(multiAddr); //到场到多点传送组中
multiSocket.receive(RmultiDatagram);//吸收UDP数据报
……
multiSocket.leaveGroup(multiAddr); //分开多点传送组
multiSocket.close(); //封闭多点传送socket
当挪用joinGroup()办法时,呆板将存眷沿着收集传送属于特定多点传送组的任何IP报文,也就是说,呆板具有了一个邮箱。主机还应利用IGMP响应地呈报组的利用。关于多IP地点的呆板,应设置数据报发送的接口:setInterface(oneOfMyLocalAddrs);
在DatagramSocket中没有相似setSoTimeout()的办法设置超时。
IP多点传送使用程序的开辟流程
因为IP多点传送次要用于同组中成员的交换,因而,使用程序的开辟流程大致以下:
1.创立一个需发送的按划定编址的数据报DatagramPacket;
2.创建一个用于发送和吸收的MulticastSocket;
3.到场一个多点传送组;
4.将数据报放进MulticastSocket中传送进来;
5.守候从MulticastSocket吸收数据报;
6.解码数据报提失信息;
7.依据失掉的信息作出回应;
8.反复5―7步;
9.分开该多点传送组,封闭MulticastSocket。
停止语
在实践使用中,发送和吸收数据倡议分离以独自的线程同时运转,别的,假如需在屏幕上显现,倡议利用两个线程在两个分歧的窗口分离卖力显现发送的数据和吸收的数据。□
作者单元:建立银行云南保山区域分行 (云南保山678000)
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流. |
|