阶段二38_面向对象高级_网络编程[UDP单播组播广播代码实现]

news2024/12/22 23:13:28

知识:

  InetAddresss:getByName,getHostName,getHostAddress方法
  UDP通信程序:单播,组播,广播代码实现

一.InetAddress 的使用

1.static InetAddress getByName(String host)

确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址

2.String getHostName()

获取此IP地址的主机名

3.String getHostAddress()

返回文本显示中的IP地址字符串

4.InetAddress代码入门:

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetadressDemo1 {
    public static void main(String[] args) throws UnknownHostException {
        //1.static InetAddress getByName(String host)[确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址]
        InetAddress address = InetAddress.getByName("沉迷代码");
        
        //2.String getHostName()     获取此IP地址的主机名
        String hostName = address.getHostName();
        System.out.println("主机名为" + hostName);
        
        //3.String getHostAddress()  返回文本显示中的IP地址字符串
        String ip = address.getHostAddress();
        System.out.println("IP为" + ip);
    }
}

二.UDP通信程序

1.UDP发送数据
(1)UDP发送数据步骤:

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

(2)UDP发送数据具体实现:

import java.io.IOException;
import java.net.*;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //1.创建发送端的DatagramSocket对象
        DatagramSocket ds = new DatagramSocket();
        //2.创建数据,并把数据打包(DatagramPacket)
        //DatagramPacket?(byte[] buf, int length, InetAddress address, int port)
        String s = "送给村长老丈人的礼物";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        //3.调用DatagramSocket对象的方法发送数据
        ds.send(dp);
        //4.释放资源
        ds.close();
    }
}

2.UDP接受数据
(1)UDP接受数据步骤:

步骤1:找码头[创建发送端的DatagramSocket对象]
步骤2:找新箱子[创建一个箱子,用于接收数据]
步骤3:码头接收礼物并放入新箱子中[调用DatagramSocket的方法接收数据并将数据放入箱子中]
步骤4:村长从箱子里获取礼物[解析数据包,并把数据在控制台显示]
步骤5:付钱走羊[释放资源]

(2)UDP接受数据具体实现:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ServerDemo {
    //注意点:
    //1.要先运行接收端,再运行发送端
    //2.如果接收端再启动之后,没有接收到数据,那么会死等(阻塞).
    //3.在接收数据的时候,需要调用一个getLength方法,表示接收到了多少字节
    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.接收礼物,把礼物放到新的箱子中
        System.out.println("-----------接收前----------");
        ds.receive(dp);
        System.out.println("------------接收后---------");
        //4.从新的箱子里面获取礼物
        //byte[] data = dp.getData();和bytes数组中数据等同
        int length = dp.getLength();
        System.out.println(new String(bytes,0,length));
        //5.拿完走羊
        ds.close();
    }
}

二.UDP通信程序单播

在这里插入图片描述

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

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

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

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
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));
        }
    }
}

三.UDP通信程序组播

在这里插入图片描述

组播地址:224.0.0.0 ~ 239.255.255.255
其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
//1.组播发送端
import java.io.IOException;
import java.net.*;
public class ClinetDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        String s = "hello 组播";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.1.0");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        ds.send(dp);
        ds.close();
    }
}
//2.组播接受端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        MulticastSocket ms = new MulticastSocket(10000);
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        //把当前计算机绑定一个组播地址,表示添加到这一组中.
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        ms.receive(dp);
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        ms.close();
    }
}

四.UDP通信程序广播
在这里插入图片描述

广播地址:255.255.255.255
//1.广播发送端
import java.io.IOException;
import java.net.*;
public class ClientDemo {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        String s = "广播 hello";
        byte[] bytes = s.getBytes();
        //255.255.255.255广播地址,路由器看到,就会连接到所有能接受地址然后进行数据发送
        InetAddress address = InetAddress.getByName("255.255.255.255"); 
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
        ds.send(dp);
        ds.close();
    }
}
//2.广播接受端
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 {
        DatagramSocket ds = new DatagramSocket(10000);
        DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
        ds.receive(dp);
        byte[] data = dp.getData();
        int length = dp.getLength();
        System.out.println(new String(data,0,length));
        ds.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/493344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】通过反射方法不改变HashCode以修改String的值

如何修改String的值? 我们首先会想到如下两种方法 方式一:通过StringBuild/StringBuffer String s1 "Hello World!"; System.out.println("s1"s1" HashCode"s1.hashCode()); StringBuilder sb new StringBuilder(s1…

Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志

Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志 C/C代码里面常用的printf没法在Android 的logcat输出显示。需要特别配置C才能显示在logcat里面。 (1)CMakeLists.txt定义: find_library( # Sets the name of the path variable.l…

yolov1原理

目标检测方法 传统的方法可以按照检测系统分为两种: DPM,Deformatable Parts Models,采用sliding window检测R-CNN、Fast R-CNN。采用region proposal的方法,生成一些可能包含待检测物体的potential bounding box,再…

opencv_c++学习(三)

一、获取图像像素指针 CV Assert(mylmage.depth() CV 8U); CV_Assert()函数判断图像数据的类型是否为uchar类型,不满足则抛出异常。 Mat.ptr(int i0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数。 Mat.ptr(int i0)获取像素矩阵的指针…

【五一创作】【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  👉3.1 使用SSH协议连接Linux开发主机  👉3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但…

shell脚本之例题详解

文章目录 1 检查用户家目录中的test.sh文件是否存在,并且检查是否有执行权限2 提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的进入选拔赛,大于10秒的都淘汰,如果输入其它字符则提示重新输入;进入选拔…

Selenium:集成测试报告

目录 一、分拆后的实现代码 二、创建用于执行所有用例的ALL_HTMLtest.py文件 三、集成测试报告 随着软件不断迭代功能越来越多,对应的测试用例也会呈指数增长。一个实现几十个功能的项目,对应的用例可能有上百个甚至更多,如果全部集成在一…

RocketMQ中单消费者订阅多个Topic,会阻塞消费吗?

RocketMQ 问题 背景是这样: 最近有个项目用MQ做消息流转,在RocketMQ集群模式下,一个消费者实例,订阅了两个Topic A、B。 Topic A:存储的是批量业务消息。 Topic B:存储的是单个业务消息。 有个小伙伴问我…

基于C++的职工管理系统

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成…

分布式系统概念和设计-分布式文件系统服务体系结构和实践经验

分布式系统概念和设计 文件系统的特点 负责文件的组织,存储,检索,命名,共享和保护 文件包含数据和属性 数据:包含一系列数据项——8比特的字节,读写操作可访问任何一部分数据属性:用一个记录表…

一文详解 SCTP 协议

SCTP(Stream Control Transmission Protocol)流控制传输协议,由 RFC2960 定义。SCTP的设计目的是提供一种可靠的、面向消息的数据传输服务,以便于支持多点通信以及满足传输的可靠性需求。SCTP 目前广泛应用于VoIP、移动通信和云计算等领域。 SCTP 主要特点SCTP 消息结构SCTP …

Android9.0 原生系统SystemUI下拉状态栏和通知栏视图之锁屏通知布局

1.前言 在9.0的系统rom定制化开发中,对于系统原生systemui的锁屏界面的功能也是非常重要的,所以在锁屏页面布局中,也是有通知栏布局的,所以接下来对于息屏亮屏 通知栏布局的相关流程分析,看下亮屏后锁屏页面做了哪些功能 2.原生系统SystemUI下拉状态栏和通知栏视图之锁…

应用层开发想转Android framework开发要从何开始

前言 现如今,由于市面上应用App的更新逐渐变少,很多Android移动应用开发者都开始转型做系统开发,这比开发应用有趣多了,因为你可以探索系统模块的运行原理,从框架层面去了解它。 在应用层,你只需要配置好…

JAVA-异常

文章目录 1.异常的体系1.3异常的分类 2.异常的处理2.2异常的抛出throw2.3异常的捕获2.3.1异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3.自定义异常类 1.异常的体系 Throwable:是异常体系的顶层类,其派生出两个重要的子类…

前端框架篇学习--选择命令式还是声明式

命令式与声明式定义 大白话:假期回家了,我想吃老妈的大盘鸡,然后老妈就去采购食材,剁鸡块,卤鸡肉,切土豆,然后爆炒起来,想方设法给我做好吃的大盘鸡。老妈上菜的餐桌,我…

SQL语句学习笔记(对库、表、字段、的操作)

查看mysql的状态 status 启动、停止 mySQL服务 图像界面方法: dos窗口执行:services.msc 控制面板–>管理工具–>服务 命令行方法: 启动: net start mysql80 停止: net stop mysql80 启动与环境变量 添加环境…

UnityShaderBook中消融dissolve详解

消融这个效果算得上游戏开发中用的比较多的一个效果,表现游戏对象消失的时候经常用到,这个效果实现也非常简单,因此在《UnityShader入门精要》中也就短短几句话讲完了,这里我想针对书中的效果详细讲解一下。 Shader源代码&#x…

(浙大陈越版)数据结构 第二章 线性结构 2.2 堆栈

目录 2.2.1 什么是堆栈 堆栈 什么是堆栈 例子:计算机如何进行表达式求值?如:56/2-3*4 后缀表达式 堆栈的抽象数据类型描述 2.2.2 堆栈的顺序存储实现 例子:用一个数组实现两个堆栈,要求能最大利用数组空间&…

路径之谜(DFS)-2016年蓝桥杯国赛

路径之谜-2016年国赛 1、题目描述2、解题思路3、代码实现1、题目描述 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn* 个方格。如下图所示。 按习俗,骑士要从西北角走到东南角。可以横向或纵向移动,但不能…

【Java虚拟机】JVM常见诊断命令和调试工具

1.JVM常用命令行参数jps和jinfo实操 准备测试代码 /*** author lixiang* date 2023/5/4 20:53*/ public class JVMTest {public static void main(String[] args) throws InterruptedException {Thread.sleep(1000000);} }(1)命令jps:全称 …