JAVA UDP的使用

要想了解UDP在java中的使用,首先我们得先要了解下UDP协议:
UDP是一种高速,无连接的数据交换方式。在有些应用程序中,保持最快的速度比保证每一位数据都正确到达更重要。例如,在实时音频或视频中,丢失数据包只会作为干扰出现。干扰是可以容忍的,但当TCP请求重传或等待数据包到达而它却迟迟不到时,音频流中就会出现尴尬的停顿,这让人无法接受的。在其他应用中,可以在应用层实现可靠性传输。例如:如果客户端向服务器发送一个短的UDP请求,倘若制定时间内没有响应返回,它会认为这个包已丢失。域名系统就是采用这样的工作方式。事实上,可以用UDP实现一个可靠的文件传输协议,而且很多人确实是这样做的:网络文件系统,简单FTP都使用了UDP协议。在这些协议中由应用程序来负责可靠性。java中的UDP实现分为两个类:DatagramPacket和 DatagramSocket。DatagramPacket类将数据字节填充到UDP包中,这称为数据报。 DatagramSocket来发送这个包。要接受数据,可以从DatagramSocket中接受一个 DatagramPack对象,然后从该包中读取数据的内容。
这种职责的划分与TCP使用的Socket和ServerSocket有所不同。首先,UDP没有两台主机间唯一连接的概念,它不需要知道对方是哪个远程主机。它可以从一个端口往多个主机发送信息,但是TCP是无法做到的。其次,TCP socket把网络链接看作是流:通过从Socket得到的输入和输出流来收发数据。UDP不支持这一点,你处理总是单个数据包。填充在一个数据报中的所有数据会以包的形式进行发送,这些数据要么作为一个组要么全部接收,要么全部丢弃。一个包不一定与下一个包相关。给定两个包,没有办法知道哪个先发哪个后发。对于流来说,必须提供数据的有序队列,与之不同,数据报会尽可能快的蜂拥到接收方。

下面给大家介绍下JAVA中UDP 接受与发送数据的初步步骤 :
发送:
使用 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();//关闭资源     
    }  
}  
```

猜你喜欢

转载自blog.csdn.net/wxjs360/article/details/75331941