udp协议

UDP 将数据源和目的封装成数据包中,不需要建立连接;
每个数据报包的大小在限制在64k;
因无连接,是不可靠协议;不需要建立连接,速度快

发送端

package com.shujia.day20.udpdemo2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/*
    1:建立udp的socket服务
    2:将要发送的数据封装成数据包
    3:通过udp的socket服务,将数据包发送出
    4:关闭资源

 */
public class SendDemo1 {
    public static void main(String[] args) throws Exception {
        //1. 创建发送端的Socket对象
        //DatagramSocket() 创建一个数据报套接字,绑定到指定的本地地址。
        DatagramSocket s = new DatagramSocket();
        Scanner sc = new Scanner(System.in);

        while (true){
            System.out.print("输入要发送的信息:");
            String info = sc.next();

            //2. 将要发送的数据封装成数据包
            //DatagramPacket
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
            byte[] buf = info.getBytes(); // 要发送的数据内容字节数组形式
            int length = buf.length; //字节数组的长度
            InetAddress address =  InetAddress.getByName("192.168.28.254"); // 目标机器的ip地址的InetAddress对象
            int port = 10086; //目标机器程序绑定的端口号
            DatagramPacket packet = new DatagramPacket(buf, length, address, port);

            //3. 通过udp的socket服务,将数据包发送出
            //public void send(DatagramPacket p)
            s.send(packet);

            if("over".equals(info)){
                System.out.println("结束会话...正在关闭发送端");
                break;
            }
        }



        //4:关闭资源
        s.close();
    }
}

接收端

package com.shujia.day20.udpdemo2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    udp协议接收者编程:
        1:建立udp的socket服务.
        2:通过receive方法接收数据
        3:将收到的数据存储到数据包对象中
        4:通过数据包对象的功能来完成对接收到数据进行解析.
        5:可以对资源进行关闭

 */
public class ReceiveDemo1 {
    public static void main(String[] args) throws Exception {
        //1. 创建接收端的Socket对象,并绑定端口号
        //DatagramSocket(int port)
        //构造数据报套接字并将其绑定到本地主机上的指定端口。
        DatagramSocket s = new DatagramSocket(10086);

        //创建一个用于存储接收到的数据的数据包
        //DatagramPacket(byte[] buf, int length)
        //构造一个 DatagramPacket用于接收长度的数据包 length 。
        byte[] bao = new byte[2048];
        int length = bao.length;
        DatagramPacket packet = new DatagramPacket(bao, length);

        while (true){
            //2:通过receive方法接收数据
            s.receive(packet);


            //通过数据包对象的功能来完成对接收到数据进行解析.
            //获取数据包中的数据
            byte[] data = packet.getData();
            //int getLength() 返回要发送的数据的长度或接收到的数据的长度。
            int len = packet.getLength();
            String info = new String(data, 0, len);


            //InetAddress getAddress() 获取发送者的信息
            //返回该数据报发送或接收数据报的计算机的IP地址。
            InetAddress address = packet.getAddress();
            String hostName = address.getHostName();
            String ip = address.getHostAddress();
            if("over".equals(info)){
                System.out.println("***********************************");
                System.out.println(hostName + "发送已结束会话....");
                System.out.println("***********************************");
                break;
            }

            System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            System.out.println("有一条数据来自ip地址为:"+ip);
            System.out.println("主机名:" + hostName + ",发来一条消息:" + info);
            System.out.println("------------------------------------------------------------------");
        }

        //关闭资源
        s.close();


    }
}
posted @ 2024-08-20 20:23  ていせい  阅读(3)  评论(0编辑  收藏  举报