网络编程(2)UDP通信协议

UDP通信协议

1️⃣UDP通信程序

观看下图:喜羊羊要怎么把东西给到村长?

首先要找到码头,然后把所有东西装进包裹中,装进包裹后,包裹上面贴着村长的地址,然后发送包裹

所以,发送礼物(UDP发送数据)的步骤大致如下:

  1. 找码头-----》创建发送端的DatagramSocket对象
  2. 打包礼物----》创建数据,并把数据打包(DatagramPacket
  3. 由码头发送包裹----》调用DatagramSocket对象的方法发送数据
  4. 付钱走羊-----》释放资源

UDP发送数据代码演示:

import java.io.IOException;
import java.net.*;

public class ClientDemo{
    public static void main(String[] args) throws IOException {
        //1、找码头
        DatagramSocket ds=new DatagramSocket();
        //2、打包礼物
        String s="村长的礼物";
        byte[] b=s.getBytes();
        int port=10000;
        InetAddress address=InetAddress.getByName("DESKTOP-LEUS976");
        DatagramPacket dp=new DatagramPacket(b,b.length,address,port);

        //3、由码头发送包裹
        ds.send(dp);

        //4、付钱走羊
        ds.close();
    }
}

村长接收礼物的流程(UDP接收端接收数据)的大致流程如下:

1、找码头----》创建接收端的DatagramSocket对象

2、找新箱子----》创建一个箱子DatagramPacket,用于接收数据

3、码头接收礼物并放入新箱子中---》调用DatagramSocket的方法接收数据并将数据放入箱子中

4、村长从箱子里获取礼物----》解析数据包,并把数据在控制台显示

5、拿完走羊-----》释放资源

UDP接收数据代码演示:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //1、找码头  -----表示接收端从10000端口接收数据的
        DatagramSocket ds=new DatagramSocket(10000);
        //2、创建新箱子
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
        //3、接收礼物,把礼物放到新的箱子中
        ds.receive(dp);
        //4、从新箱子中获取礼物
        byte[] data=dp.getData();
        int length=dp.getLength();
        System.out.println(new String(data,0,length));
        //5、拿完走羊
        ds.close();
    }
}

先运行接收端代码,再运行发送端代码,运行结果如下:

image-20200610010613111

注意:

  • 要先运行接收端,再运行发送端
  • 如果接收端启动后,没有接收到数据,那么会死等(阻塞)
  • 在接收数据的时候,需要调用一个getLength方法,表示接收到了多少字节

2️⃣UDP通信程序练习

练习要求:

  • UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
  • UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

发送端的代码:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class ClientDemo{
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        Scanner sc=new Scanner(System.in);
        InetAddress address = InetAddress.getByName("DESKTOP-LEUS976");
        int port=10000;
        while(true){
            String s=sc.nextLine();
            if(s.equals("886")){
                break;
            }
            byte[] bytes=s.getBytes();
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
            ds.send(dp);
        }
        ds.close();
    }
}

接收端的代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds=new DatagramSocket(10000);
        while(true){
            byte[] bytes=new byte[1024];
            DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
            ds.receive(dp);
            byte[] data=dp.getData();
            int length=dp.getLength();
            System.out.println(new String(data,0,length));
        }
//        ds.close();  此案例不要这个
    }
}

先运行接收端,再运行发送端,运行结果如下:

image-20200610012402494

image-20200610012416461

3️⃣UDP的三种通信方式

单播

组播

广播(发送给局域网中的所有设备)

4️⃣组播的代码实现:

组播地址范围:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.255为预留的组播地址,我们不能使用,我们只能使用244.0.1.0之后的范围。

组播的发送端的代码实现:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class ClientDemo{
    public static void main(String[] args) throws IOException {
        DatagramSocket ds=new DatagramSocket();
        String s="数据";
        byte[] bytes=s.getBytes();
        int port=10000;
        InetAddress address=InetAddress.getByName("224.0.1.0");
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
        ds.send(dp);
        ds.close();
    }
}

组播的接收端的代码实现

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        MulticastSocket ms=new MulticastSocket(10000);

        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        byte[] bytes=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bytes,bytes.length);

        ms.receive(dp);
        byte[] data = dp.getData();
        int length=dp.getLength();
        System.out.println(new String(data,0,length));
    }
}

5️⃣广播的发送端代码实现:

image-20200610014143368

posted @ 2020-08-27 23:39  Whatever_It_Takes  阅读(237)  评论(0编辑  收藏  举报