• UDP通信程序的详细解析


    2.UDP通信程序

    2.1 UDP发送数据

    • Java中的UDP通信

      • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念

      • Java提供了DatagramSocket类作为基于UDP协议的Socket

    • 构造方法

      方法名说明
      DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
      DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口
    • 相关方法

      方法名说明
      void send(DatagramPacket p)发送数据报包
      void close()关闭数据报套接字
      void receive(DatagramPacket p)从此套接字接受数据报包
    • 发送数据的步骤

      • 创建发送端的Socket对象(DatagramSocket)

      • 创建数据,并把数据打包

      • 调用DatagramSocket对象的方法发送数据

      • 关闭发送端

    • 代码演示

      1. public class SendDemo {
      2.    public static void main(String[] args) throws IOException {
      3.        //创建发送端的Socket对象(DatagramSocket)
      4.        // DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
      5.        DatagramSocket ds = new DatagramSocket();
      6.        //创建数据,并把数据打包
      7.        //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
      8.        //构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
      9.        byte[] bys = "hello,udp,我来了".getBytes();
      10.        DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
      11.        //调用DatagramSocket对象的方法发送数据
      12.        //void send(DatagramPacket p) 从此套接字发送数据报包
      13.        ds.send(dp);
      14.        //关闭发送端
      15.        //void close() 关闭此数据报套接字
      16.        ds.close();
      17.   }
      18. }

    2.2UDP接收数据

    • 接收数据的步骤

      • 创建接收端的Socket对象(DatagramSocket)

      • 创建一个数据包,用于接收数据

      • 调用DatagramSocket对象的方法接收数据

      • 解析数据包,并把数据在控制台显示

      • 关闭接收端

    • 构造方法

      方法名说明
      DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包
    • 相关方法

      方法名说明
      byte[] getData()返回数据缓冲区
      int getLength()返回要发送的数据的长度或接收的数据的长度
    • 示例代码

      1. public class ReceiveDemo {
      2.    public static void main(String[] args) throws IOException {
      3.     //创建接收端的Socket对象(DatagramSocket)
      4.     DatagramSocket ds = new DatagramSocket(12345);
      5.     //创建一个数据包,用于接收数据
      6.     byte[] bys = new byte[1024];
      7.     DatagramPacket dp = new DatagramPacket(bys, bys.length);
      8.     //调用DatagramSocket对象的方法接收数据
      9.     ds.receive(dp);
      10.     //解析数据包,并把数据在控制台显示
      11.     System.out.println("数据是:" + new String(dp.getData(), 0,                                             dp.getLength()));
      12.       }
      13.   }
      14. }

    2.3UDP通信程序练习

    • 案例需求

      UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

      UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

    • 代码实现

      1. /*
      2.    UDP发送数据:
      3.        数据来自于键盘录入,直到输入的数据是886,发送数据结束
      4. */
      5. public class SendDemo {
      6.    public static void main(String[] args) throws IOException {
      7.        //创建发送端的Socket对象(DatagramSocket)
      8.        DatagramSocket ds = new DatagramSocket();
      9.        //键盘录入数据
      10.        Scanner sc = new Scanner(System.in);
      11.        while (true) {
      12.         String s = sc.nextLine();
      13.            //输入的数据是886,发送数据结束
      14.            if ("886".equals(s)) {
      15.                break;
      16.           }
      17.            //创建数据,并把数据打包
      18.            byte[] bys = s.getBytes();
      19.            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.66"), 12345);
      20.            //调用DatagramSocket对象的方法发送数据
      21.            ds.send(dp);
      22.       }
      23.        //关闭发送端
      24.        ds.close();
      25.   }
      26. }
      27. /*
      28.    UDP接收数据:
      29.        因为接收端不知道发送端什么时候停止发送,故采用死循环接收
      30. */
      31. public class ReceiveDemo {
      32.    public static void main(String[] args) throws IOException {
      33.        //创建接收端的Socket对象(DatagramSocket)
      34.        DatagramSocket ds = new DatagramSocket(12345);
      35.        while (true) {
      36.            //创建一个数据包,用于接收数据
      37.            byte[] bys = new byte[1024];
      38.            DatagramPacket dp = new DatagramPacket(bys, bys.length);
      39.            //调用DatagramSocket对象的方法接收数据
      40.            ds.receive(dp);
      41.            //解析数据包,并把数据在控制台显示
      42.            System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
      43.       }
      44.        //关闭接收端
      45. //       ds.close();
      46.   }
      47. }

    2.4UDP三种通讯方式

    • 单播

      单播用于两个主机之间的端对端通信

    • 组播

      组播用于对一组特定的主机进行通信

    • 广播

      广播用于一个主机对整个局域网上所有主机上的数据通信

    2.5UDP组播实现

    • 实现步骤

      • 发送端

        1. 创建发送端的Socket对象(DatagramSocket)

        2. 创建数据,并把数据打包(DatagramPacket)

        3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)

        4. 释放资源

      • 接收端

        1. 创建接收端Socket对象(MulticastSocket)

        2. 创建一个箱子,用于接收数据

        3. 把当前计算机绑定一个组播地址

        4. 将数据接收到箱子中

        5. 解析数据包,并打印数据

        6. 释放资源

    • 代码实现

      1. // 发送端
      2. public class ClinetDemo {
      3.    public static void main(String[] args) throws IOException {
      4.        // 1. 创建发送端的Socket对象(DatagramSocket)
      5.        DatagramSocket ds = new DatagramSocket();
      6.        String s = "hello 组播";
      7.        byte[] bytes = s.getBytes();
      8.        InetAddress address = InetAddress.getByName("224.0.1.0");
      9.        int port = 10000;
      10.        // 2. 创建数据,并把数据打包(DatagramPacket)
      11.        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
      12.        // 3. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
      13.        ds.send(dp);
      14.        // 4. 释放资源
      15.        ds.close();
      16.   }
      17. }
      18. // 接收端
      19. public class ServerDemo {
      20.    public static void main(String[] args) throws IOException {
      21.        // 1. 创建接收端Socket对象(MulticastSocket)
      22.        MulticastSocket ms = new MulticastSocket(10000);
      23.        // 2. 创建一个箱子,用于接收数据
      24.        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
      25.        // 3. 把当前计算机绑定一个组播地址,表示添加到这一组中.
      26.        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
      27.        // 4. 将数据接收到箱子中
      28.        ms.receive(dp);
      29.        // 5. 解析数据包,并打印数据
      30.        byte[] data = dp.getData();
      31.        int length = dp.getLength();
      32.        System.out.println(new String(data,0,length));
      33.        // 6. 释放资源
      34.        ms.close();
      35.   }
      36. }

    2.6UDP广播实现

    • 实现步骤

      • 发送端

        1. 创建发送端Socket对象(DatagramSocket)

        2. 创建存储数据的箱子,将广播地址封装进去

        3. 发送数据

        4. 释放资源

      • 接收端

        1. 创建接收端的Socket对象(DatagramSocket)

        2. 创建一个数据包,用于接收数据

        3. 调用DatagramSocket对象的方法接收数据

        4. 解析数据包,并把数据在控制台显示

        5. 关闭接收端

    • 代码实现

      1. // 发送端
      2. public class ClientDemo {
      3.    public static void main(String[] args) throws IOException {
      4.     // 1. 创建发送端Socket对象(DatagramSocket)
      5.        DatagramSocket ds = new DatagramSocket();
      6. // 2. 创建存储数据的箱子,将广播地址封装进去
      7.        String s = "广播 hello";
      8.        byte[] bytes = s.getBytes();
      9.        InetAddress address = InetAddress.getByName("255.255.255.255");
      10.        int port = 10000;
      11.        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
      12. // 3. 发送数据
      13.        ds.send(dp);
      14. // 4. 释放资源
      15.        ds.close();
      16.   }
      17. }
      18. // 接收端
      19. public class ServerDemo {
      20.    public static void main(String[] args) throws IOException {
      21.        // 1. 创建接收端的Socket对象(DatagramSocket)
      22.        DatagramSocket ds = new DatagramSocket(10000);
      23.        // 2. 创建一个数据包,用于接收数据
      24.        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
      25.        // 3. 调用DatagramSocket对象的方法接收数据
      26.        ds.receive(dp);
      27.        // 4. 解析数据包,并把数据在控制台显示
      28.        byte[] data = dp.getData();
      29.        int length = dp.getLength();
      30.        System.out.println(new String(data,0,length));
      31.        // 5. 关闭接收端
      32.        ds.close();
      33.   }
      34. }

    ##3. TCP通信程序

    3.1TCP发送数据

    • Java中的TCP通信

      • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。

      • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

    • 构造方法

      方法名说明
      Socket(InetAddress address,int port)创建流套接字并将其连接到指定IP指定端口号
      Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
    • 相关方法

      方法名说明
      InputStream getInputStream()返回此套接字的输入流
      OutputStream getOutputStream()返回此套接字的输出流
    • 示例代码

      1. public class Client {
      2.    public static void main(String[] args) throws IOException {
      3.        //TCP协议,发送数据
      4.        //1.创建Socket对象
      5.        //细节:在创建对象的同时会连接服务端
      6.        //     如果连接不上,代码会报错
      7.        Socket socket = new Socket("127.0.0.1",10000);
      8.        //2.可以从连接通道中获取输出流
      9.        OutputStream os = socket.getOutputStream();
      10.        //写出数据
      11.        os.write("aaa".getBytes());
      12.        //3.释放资源
      13.        os.close();
      14.        socket.close();
      15.   }
      16. }

    3.2TCP接收数据

    • 构造方法

      方法名说明
      ServletSocket(int port)创建绑定到指定端口的服务器套接字
    • 相关方法

      方法名说明
      Socket accept()监听要连接到此的套接字并接受它
    • 注意事项

      1. accept方法是阻塞的,作用就是等待客户端连接

      2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接

      3. 针对客户端来讲,是往外写的,所以是输出流 针对服务器来讲,是往里读的,所以是输入流

      4. read方法也是阻塞的

      5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作

      6. 最后一步断开连接,通过四次挥手协议保证连接终止

    • 三次握手和四次挥手

      • 三次握手

      • 四次挥手

    • 示例代码

      1. public class Server {
      2.    public static void main(String[] args) throws IOException {
      3.        //TCP协议,接收数据
      4.        //1.创建对象ServerSocker
      5.        ServerSocket ss = new ServerSocket(10000);
      6.        //2.监听客户端的链接
      7.        Socket socket = ss.accept();
      8.        //3.从连接通道中获取输入流读取数据
      9.        InputStream is = socket.getInputStream();
      10.        int b;
      11.        while ((b = is.read()) != -1){
      12.            System.out.println((char) b);
      13.       }
      14.        //4.释放资源
      15.        socket.close();
      16.        ss.close();
      17.   }
      18. }

    3.3TCP程序练习(传输中文)

    发送端:

    1. public class Client {
    2.    public static void main(String[] args) throws IOException {
    3.        //TCP协议,发送数据
    4.        //1.创建Socket对象
    5.        //细节:在创建对象的同时会连接服务端
    6.        //     如果连接不上,代码会报错
    7.        Socket socket = new Socket("127.0.0.1",10000);
    8.        //2.可以从连接通道中获取输出流
    9.        OutputStream os = socket.getOutputStream();
    10.        //写出数据
    11.        os.write("你好你好".getBytes());//12字节
    12.        //3.释放资源
    13.        os.close();
    14.        socket.close();
    15.   }
    16. }

    接收端:

    1. public class Server {
    2.    public static void main(String[] args) throws IOException {
    3.        //TCP协议,接收数据
    4.        //1.创建对象ServerSocker
    5.        ServerSocket ss = new ServerSocket(10000);
    6.        //2.监听客户端的链接
    7.        Socket socket = ss.accept();
    8.        //3.从连接通道中获取输入流读取数据
    9.        InputStream is = socket.getInputStream();
    10.        InputStreamReader isr = new InputStreamReader(is);
    11.        BufferedReader br = new BufferedReader(isr);
    12.        // BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    13.        int b;
    14.        while ((b = br.read()) != -1){
    15.            System.out.print((char) b);
    16.       }
    17.        //4.释放资源
    18.        socket.close();
    19.        ss.close();
    20.   }
    21. }

  • 相关阅读:
    云上攻防-云服务篇&对象存储&Bucket桶&任意上传&域名接管&AccessKey泄漏
    Python try except else或finally异常处理
    Vue组件之间通信
    GD32F4(9):GD32f4出现上电不工作,必须按复位程序才能跑起来
    【矩阵论】4. 矩阵运算——广义逆——广义逆的计算
    树莓派入门
    Java基础之《Ajax+JQuery(JavaEE开发进阶Ⅱ)》—JQuery与Ajax的应用(2)
    [附源码]Python计算机毕业设计Django电子相册管理系统
    webpack之处理js资源之eslint
    【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/133625051