java 中怎么使用UDP?

Python012

java 中怎么使用UDP?,第1张

发送步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。

数据打包到DatagramPacket中去

通过socket服务发送 (send()方法)

关闭资源

import java.io.IOException  

import java.net.*  

  

public class Send {  

  

    public static void main(String[] args)  {  

          

        DatagramSocket ds = null  //建立套间字udpsocket服务  

          

        try {  

          ds = new DatagramSocket(8999)  //实例化套间字,指定自己的port  

        } catch (SocketException e) {  

            System.out.println("Cannot open port!")  

            System.exit(1)   

        }  

          

        byte[] buf= "Hello, I am sender!".getBytes()  //数据  

        InetAddress destination = null   

        try {  

            destination = InetAddress.getByName("192.168.1.5")  //需要发送的地址  

        } catch (UnknownHostException e) {  

            System.out.println("Cannot open findhost!")  

            System.exit(1)   

        }  

        DatagramPacket dp =   

                new DatagramPacket(buf, buf.length, destination , 10000)    

        //打包到DatagramPacket类型中(DatagramSocket的send()方法接受此类,注意10000是接受地址的端口,不同于自己的端口!)  

          

        try {  

            ds.send(dp)  //发送数据  

        } catch (IOException e) {  

        }  

        ds.close()  

    }  

}

接收步骤:

使用 DatagramSocket(int port) 建立socket(套间字)服务。(我们注意到此服务即可以接收,又可以发送),port指定监视接受端口。

定义一个数据包(DatagramPacket),储存接收到的数据,使用其中的方法提取传送的内容

通过DatagramSocket 的receive方法将接受到的数据存入上面定义的包中

使用DatagramPacket的方法,提取数据。

关闭资源。

import java.net.*  

  

public class Rec {  

  

    public static void main(String[] args) throws Exception {  

          

        DatagramSocket ds = new DatagramSocket(10000)  //定义服务,监视端口上面的发送端口,注意不是send本身端口  

          

        byte[] buf = new byte[1024]//接受内容的大小,注意不要溢出  

          

        DatagramPacket dp = new DatagramPacket(buf,0,buf.length)//定义一个接收的包  

          

        ds.receive(dp)//将接受内容封装到包中  

          

        String data = new String(dp.getData(), 0, dp.getLength())//利用getData()方法取出内容  

          

        System.out.println(data)//打印内容  

          

        ds.close()//关闭资源     

    }  

}

java UDP连接,如果要发送文件的话,你只能自己定义一系列的协议

因为TCP UDP 双方发送都是二进制数据

那么这个实现非常复杂

得不停的发送数据,写数据,建议使用http协议

对一个连接而言,若能够了解端点间的传输往返时间(RTT,Round Trip Time),则可根据RTT来设置一合适的RTO。显然,在任何时刻连接的RTT都是随机的,无法事先预知。TCP通过测量来获得连接当前RTT的一个估计值,并以该RTT估计值为基准来设置当前的RTO。自适应重传算法的关键就在于对当前RTT的准确估计,以便适时调整RTO。

为了搜集足够的数据来精确地估算当前的RTT,TCP对每个报文都记录下发送出的时间和收到的确认时间。每一个(发送时间,确认时间)对就可以计算出一个RTT测量值的样本(Sample RTT)。TCP为每一个活动的连接都维护一个当前的RTT估计值。该值是对已经过去的一个时间段内该连接的RTT了两只的加权平均,并作为TCP对连接当前实际的RTT值的一种估计。RTT估计值将在发送报文段时被用于确定报文段的RTO。为了保证它能够比较准确地反应当前的网络状态,每当TCP通过测量获得了个新的RTT样本时,都将对RTT的估计值进行更新。不同的更新算法或参数可能获得不同的特性。

最早的TCP曾经用了一个非常简单的公式来估计当前网络的状况,如下

R<-aR+(1-a)MRTP=Rb其中a是一个经验系数为0.1,b通常为2。注意,这是经验,没有推导过程,这个数值是可以被修改的。这个公式是说用旧的RTT(R)和新的RTT (M)综合到一起来考虑新的RTT(R)的大小。但又可以看到,这种估计在网络变化很大的情况下完全不能做出“灵敏的反应”,于是就有下面的修正公式:

Err=M-AA<-A+gErrD<-D+h(|Err|-D)RTO=A+4D,这个递推公式甚至把方差这种统计概念也使用了进来,使得偏差更加的小。而且,必须要指出的是,这两组公式更新,都是在 数据成功传输的情况下才进行,在发生数据重新传输的情况下,并不使用上面的公式进行网络估计,理由很简单,因为程序已经不在正常状态下了,估计出来的数据 也是没有意义的。