ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)

2022-03-02 18:58:18  阅读:217  来源: 互联网

标签:DatagramSocket UDP java buffer packet 七十八 2022Java import new


2022Java学习笔记七十八(网络编程:UDP通信,一发一收,多发多收消息接收实现)

一、快速入门
DatagramPacket:数据包对象
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实例代码
定义发送端

package com.zcl.d8_udp1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/*
    发送端 一发一收
 */
public class ClientDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("-------客户务端--------");
        // 创建发送端对象:发送端自带的端口号
        DatagramSocket socket = new DatagramSocket();

        // 2、创建一个数据包对象封装数据
        /**
         * 参数一:封装要发送的数据
         * 参数二:发送数据的大下
         * 参数三:服务器IP地址
         * 参数四:服务的的端口
         */
        byte[] buffer = "iu覆盖哈怂分红四".getBytes();
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8881);

        // 发送数据出去
        socket.send(packet);
        // 释放资源
        socket.close();
    }
}

定义服务端接收

package com.zcl.d8_udp1;

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

/*
    接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("-------启动服务端--------");
        // 1、创建接收端对象,注册端口
        DatagramSocket socket = new DatagramSocket(8881);
        // 2、创建一个数据包对象接收数据
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
        // 3、等待接收数据
        socket.receive(packet);
        // 4、取出数据
        // 读取多少取多少
        int len = packet.getLength();
        String rs = new String(buffer,0,len);
        System.out.println("收到数据:"+rs);
        // 获取发送端的ip和端口
        String ip = packet.getSocketAddress().toString();
        System.out.println("发送端的地址:"+ip);
        int port = packet.getPort();
        System.out.println("对方端口:"+port);
        /*
            -------启动服务端--------
            收到数据:iu覆盖哈怂分红四
         */
        // 释放资源
        socket.close();
    }
}

关于启动:先启动服务的再启动发送端,返回服务端的输出就可以看到打印出来接收的数据==

二、使用UDP实现多发和多收
在这里插入图片描述
实例代码

package com.zcl.d9_udp2;

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

/*
    发送端 多发多收
 */
public class ClientDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("-------客户务端--------");
        // 创建发送端对象:发送端自带的端口号
        DatagramSocket socket = new DatagramSocket();

        // 2、创建一个数据包对象封装数据
        /**
         * 参数一:封装要发送的数据
         * 参数二:发送数据的大下
         * 参数三:服务器IP地址
         * 参数四:服务的的端口
         */

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入需要发送的信息:");
            String msg = sc.nextLine();
            byte[] buffer = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8881);
            //退出判断
            if("exit".equals(msg)){
                System.out.println("离线成功");
                socket.close(); // 释放资源
                break;
            }
            // 发送数据出去
            socket.send(packet);
        }

    }
}

在这里插入图片描述

实例代码

package com.zcl.d9_udp2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/*
    接收端
 */
public class ServerDemo2 {
    public static void main(String[] args) throws Exception {
        System.out.println("-------启动服务端--------");
        // 1、创建接收端对象,注册端口
        DatagramSocket socket = new DatagramSocket(8881);
        // 2、创建一个数据包对象接收数据
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
        while (true) {
            // 3、等待接收数据
            socket.receive(packet);
            // 4、取出数据
            // 读取多少取多少
            int len = packet.getLength();
            String rs = new String(buffer,0,len);
            System.out.println("接收到了来自:"+packet.getSocketAddress().toString()+",端口号为:"+packet.getPort()+"的信息:"+rs);
        }
    }
}

三、广播和组播

UDP如何实现广播
使用广播地址:255.255.255.255

具体操作:
① 发送端发送的数据包的目的地写的是广播地址、且指定端口。(255.255.255.255, 9999)
② 本机所在网段的其他主机的程序只要匹配端口成功即就可以收到消息了。(9999)

UDP如何实现组播
使用组播地址:224.0.0.0~239.255.255.255

具体操作:
① 发送端的数据包的目的地是组播IP(例如:224.0.1.1,端口:9999)
② 接收端必须绑定该组播IP(224.0.1.1),端口还要对应发送端的目的端口9999,这样即可接收该组播消息。
③DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP。

标签:DatagramSocket,UDP,java,buffer,packet,七十八,2022Java,import,new
来源: https://blog.csdn.net/baidu_39378193/article/details/123233587

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有