欢迎来到天天文库
浏览记录
ID:22530095
大小:89.50 KB
页数:15页
时间:2018-10-30
《java网络编程 (4)new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java网络编程(4)作者:刘晓华发文时间:2004.11.22 Datagram套接字 Datagram(数据报)是一种尽力而为的传送数据的方式,它只是把数据的目的地记录在数据包中,然后就直接放在网络上,系统不保证数据是否能安全送到,或者什么时候可以送到,也就是说它并不保证传送质量。 1UDP套接字 数据报(Datagram)是网络层数据单元在介质上传输信息的一种逻辑分组格式,它是一种在网络中传播的、独立的、自身包含地址信息的消息,它能否到达目的地、到达的时间、到达时内容是否会
2、变化不能准确地知道。它的通信双方是不需要建立连接的,对于一些不需要很高质量的应用程序来说,数据报通信是一个非常好的选择。还有就是对实时性要求很高的情况,比如在实时音频和视频应用中,数据包的丢失和位置错乱是静态的,是可以被人们所忍受的,但是如果在数据包位置错乱或丢失时要求数据包重传,就是用户所不能忍受的,这时就可以利用UDP协议传输数据包。在Java的java.net包中有两个类DatagramSocket和DatagramPacket,为应用程序中采用数据报通信方式进行网络通信。 使用数据包方式首
3、先将数据打包,Java.net包中的DategramPacket类用来创建数据包。数据包有两种,一种用来传递数据包,该数据包有要传递到的目的地址;另一种数据包用来接收传递过来的数据包中的数据。要创建接收的数据包,通过DatagramPackett类的方法构造: publicDatagramPacket(byteibuft[],intilength) publicDatagramPacket(byteibuft[],intoffset,intilength) ibuf[]为接受数据包的存
4、储数据的缓冲区的长度,ilength为从传递过来的数据包中读取的字节数。当采用第一种构造方法时,接收到的数据从ibuft[0]开始存放,直到整个数据包接收完毕或者将ilength的字节写入ibuft为止。采用第二种构造方法时,接收到的数据从ibuft[offset]开始存放。如果数据包长度超出了ilength,则触发IllegalArgument-Exception。不过这是RuntimeException,不需要用户代码捕获。示范代码如下: byte[]buffer=newbyte[8912];
5、 DatagramPacketdatap=newDatagramPacket(buffer,buffer.length()); 创建发送数据包的构造方法为: publicDatagramPacket(bytibuf[],intilength,InetAddrssiaddr,intport) publicDatagramPacket(bytibuf[],intoffset,intilength,InetAddrssiaddr,intport) iaddr为数据包要传递到的目标
6、地址,port为目标地址的程序接受数据包的端口号(即目标地址的计算机上运行的客户程序是在哪一个端口接收服务器发送过来的数据包)。ibuf[]为要发送数据的存储区,以ibuf数组的offset位置开始填充数据包ilength字节,如果没有offset,则从ibuf数组的0位置开始填充。以下示范代码是要发送一串字符串:Strings=newString("javanetworking");byte[]data=s.getbytes();intport=1024;try{InetAddressineta=In
7、etAddress.getByName("169.254.0.14");DatagramPacketdatap=newDatagramPacket(data,data.length(),ineta,port);}catch(IOExceptione){} 数据包也是对象,也有操作方法用来获取数据包的信息,这是很有用的。其方法如下: ·publicInetAddressgetAddress()如果是发送数据包,则获得数据包要发送的目标地址,但是如果是接收数据包则返回发送此数据包的源地址。
8、 ·publicbyte[]getData()返回一个字节数组,其中是数据包的数据。如果想把字节数组转换成别的类型就要进行转化。如果想转化成String类型,可以进行以下的处理,设DatagramPacketdatap为: Strings=newString(datap.getbytes()); ·publicintgetLength()获得数据包中数据的字节数。 ·pubicintgetPort()返回数据包中的目标地址
此文档下载收益归作者所有