首页 > 代码库 > UDP网络编程

UDP网络编程

 




IP地址和端口
IP地址:是计算机在网络中的唯一标示,我们在进行网络编程时一定要定位到远程计算机,而IP地址就是解决这个问题的。
端口:除了计算机外我们还要定位到具体的应用程序进程,而端口就是给应用程序分配的身份标示。
UDP和TCP
UDP:1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
           2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64kB之内。
            3,UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
TCP:1,面向连接的协议,在socket之间进行数据传输之前必须要建立连接,是通过三次握手来建立连接的,所以在TCP中需要连接时                    间。
            2,TCP传输数据大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。
            3,TCP是一个可靠的协议,它确保接收方完全正确的获取发送方所发送的全部数据。
数据帧格式

Socket
简单理解下,Socket就是一个应用程序编程的机制和一种接口,可以理解为是应用程序创建的一个港口码头,应用程序只要把装着货物的集装箱(在程序中就是要通过网络发送的数据)放到港口码头上,就算完成了货物的运送,剩下来的工作就由货运公司去处理了(在计算机中由驱动程序来充当货运公司)。如果把DatagramSocket比喻为创建的港口码头,那么DatagramPacket就是我们发送和接收数据的集装箱。
关于InetAddress类
java中的InetAddress 类是一个代表IP地址的封装。IP地址可以由字节数组和字符串来分别表示,InetAddress将IP地址以对象的形式进行封装,可以更方便的操作和获取其属性。InetAddress没有构造方法,可以通过两个静态方法获得它的对象。
public class IPDemo {

    /**
     * @param args
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException {

        //获取本地主机ip对象。
//        InetAddress ip = InetAddress.getLocalHost();
        InetAddress ip = InetAddress.getByName("192.168.1.252");
       
        //获取ip对象中的ip地址字符串。或者ip地址对应的主机名称。
        System.out.println(ip.getHostAddress());
        System.out.println(ip.getHostName());
    }

}

UDP编程
接收端
 public class UDPRece {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        /*
         * udp的接收端:
         * 思路:
         * 1,创建udpsocket服务。
         * 2,接收数据并存储到数据包中,存储到数据包中的目的是为了解析接收到的数据。
         * 3,将解析到的数据打印到显示器。
         * 4,关闭服务。
         */
        System.out.println("udp 接收端开启");
        //1,创建udp的socket服务。用于接收端,一定要指定端口,因为必须要明确从哪个端口来的数据是这个应用程序所能解析的。
        //简单说:接收端必须监听一个端口。
        DatagramSocket  ds = new DatagramSocket(10000);
        
    
        //2,接收数据到数据包中。
        byte[] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        
        ds.receive(dp);
        
        //3,解析数据包中的具体数据。
        String ip = dp.getAddress().getHostAddress();
        int port = dp.getPort();
        String text = new String(dp.getData(),0,dp.getLength());
        System.out.println(ip+":::"+port+":::::"+text);
        
        //4,关闭资源。
        ds.close();
        System.out.println("udp 接收端关闭");
    }

}
发送端
public class UDPSend {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        /*
         * 通过udp协议创建一个发送端。
         * 思路:
         * 1,应该有可以通过该协议传输数据的对象。先有udp服务。
         * 2,有数据,并将数据封装到数据包,并在包上明确目的地址。
         * 3,通过udp服务将这个数据包发出去。
         * 4,关闭资源。
         */
        System.out.println("udp 发送端开启");
        //1,创建udp socket服务.
        DatagramSocket ds = new DatagramSocket(8888);       
       
        //2,明确数据,并将数据封装到数据包中。
        String str = "udp演示,哥们来了";
        byte[] buf = str.getBytes();
        DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.252"),10000);
       
        //3,将数据包通过socket服务发送。
        ds.send(dp);
       
        //4,关闭资源。
        ds.close();
        System.out.println("udp 发送端关闭");
       
    }

}