java中InetAddress类和实现UDP通信(使用DatagramSocket和DatagramPacket类)

InetAddress:

代表IP地址

public static InetAddress getLocalHost() throws UnknownHostException

Returns the address of the local host.

获取本机IP,会以一个inetAddress的对象返回

public static InetAddress getByName(String host) throws UnknownHostException

Determines the IP address of a host, given the host's name.

根据ip地址或者域名,返回一个inetAddress对象 

public String getHostName()

Gets the host name for this IP address.

获取ip地址对象对应的主机名 

 public String getHostAddress()

Returns the IP address string in textual presentation.

获取ip地址对象中的ip地址信息

public boolean isReachable(int timeout) throws IOException

在指定毫秒内,判断主机与该ip对应的主机是否能连通 

public class test1 {
    public static void main(String[] args) throws IOException {
        //1:获取本机IP地址对象
        InetAddress addr=InetAddress.getLocalHost();
        System.out.println(addr.getHostName());
        System.out.println(addr.getHostAddress());

        //2:获取指定IP或者域名的IP地址对象
        InetAddress addr2=InetAddress.getByName("www.baidu.com");
        System.out.println(addr2.getHostName());
        System.out.println(addr2.getHostAddress());


        System.out.println(addr2.isReachable(5000));//判断本机是否能和addr2(百度IP)在5s内连通
        //相当于 ping www.baidu.com
    }
}

 端口

用于标记正在计算机设备上运行的应用程序

分类:

周知端口:0~1023,被预先定义的知名应用占用

注册端口:1024~49151,分配给用户进程或某些应用程序

动态端口:49152~65535,因为它一般不固定分配某种进程,而是动态分配

注意:我们自己开发的程序一般选择注册端口,且一个设备中不能出现两个程序的端口号一致,否则出错

DatagramSocket:用与创建UDP客户端,服务端

public DatagramSocket() throws SocketException

Constructs a datagram socket and binds it to any available port on the local host machine. The socket will be bound to the wildcard address.

创建 客户端的Socket,并随机分配一个端口号

public DatagramSocket(int port) throws SocketException

Constructs a datagram socket and binds it to the specified port on the local host machine. The socket will be bound to the wildcard address.

 创建 服务端的Socket,并指定一个端口号

 public void send(DatagramPacket p) throws IOException

Sends a datagram packet from this socket. The DatagramPacket includes information indicating the data to be sent, its length, the IP address of the remote host, and the port number on the remote host.

发送数据包

public void receive(DatagramPacket p) throws IOException

 Receives a datagram packet from this socket. This method blocks(阻塞) until a datagram is received. When this method returns, the DatagramPacket's buffer is filled with the data received. The datagram packet also contains the sender's IP address, and the port number on the sender's machine. The length field of the datagram packet object contains the length of the received message. If the message is longer than the packet's length, the message is truncated(切断).

接收数据

DatagramPacket:创建数据包

 public DatagramPacket(byte[] buf, int length)

Constructs a DatagramPacket for receiving packets of length length.

创建发出去的数据包对象

public DatagramPacket(byte[] buf, int length, InetAddress address, int port)

Constructs a datagram packet for sending packets of length length to the specified port number on the specified host. 

创建发出去的数据包对象

public int getLength()

获取数据包,实际接收的字节个数 

客户端:

public class client {
    public static void main(String[] args)throws Exception {
        //创建一个sokcet对象,用于发送数据
        DatagramSocket cli=new DatagramSocket();

        //创建数据包
        Scanner sa=new Scanner(System.in);
        String s=sa.nextLine();
        byte[] bytes = s.getBytes();

        InetAddress addr=InetAddress.getLocalHost();//获取服务端地址

        DatagramPacket p=new DatagramPacket(bytes,bytes.length,addr,8888);

        //发送数据
        cli.send(p);

        cli.close();//关闭
    }
}

 服务端:
 

public class server {
    public static void main(String[] args) throws Exception{
        //创建一个服务端socket对象
        DatagramSocket ser = new DatagramSocket(8888);

        //创建一个空数据包,接收数据
        byte[]bytes=new byte[1024];
        DatagramPacket p=new DatagramPacket(bytes,bytes.length);

        //接收数据
        ser.receive(p);

        //从字节数组中,获取数据
        //接受多少,就倒出多少
        int len=p.getLength();
        String s=new String(bytes,0,len);
        System.out.println("客户端发来的数据是"+s);
        System.out.println("客户端的ip地址是:"+p.getAddress().getHostAddress());

        ser.close();
    }
}

以上只能实现一收数据,接下来实现多发多收数据:
客户端:
 

public class client {
    public static void main(String[] args)throws Exception {
        //创建一个sokcet对象,用于发送数据
        DatagramSocket cli=new DatagramSocket();

        //创建数据包
        Scanner sa=new Scanner(System.in);
        while (true) {
            String s=sa.nextLine();
            byte[] bytes = s.getBytes();

            if(Objects.equals("exit",s))
            {
                cli.close();
                break;
            }
            InetAddress addr=InetAddress.getLocalHost();//获取服务端地址

            DatagramPacket p=new DatagramPacket(bytes,bytes.length,addr,8888);

            //发送数据
            cli.send(p);
        }


    }
}

服务端:
 

public class server {
    public static void main(String[] args) throws Exception{
        //创建一个服务端socket对象
        DatagramSocket ser = new DatagramSocket(8888);

        //创建一个空数据包,接收数据
        byte[]bytes=new byte[1024];
        DatagramPacket p=new DatagramPacket(bytes,bytes.length);

        //接收数据
        while (true) {
            ser.receive(p);

            //从字节数组中,获取数据
            //接受多少,就倒出多少
            int len=p.getLength();
            String s=new String(bytes,0,len);
            System.out.println("客户端发来的数据是"+s);
            System.out.println("客户端的ip地址是:"+p.getAddress().getHostAddress());


        }
    }
}

UDP服务端可以同时接受多个客户端发来的信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于MLP算法实现交通流量预测(Pytorch版)

在海量的城市数据中,交通流量数据无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据,助力提升道路使用效率、缓解交通拥堵,还能为公众出行提供参考,实现个性化导…

C++ :设计模式实现

文章目录 原则单一职责原则开闭原则依赖倒置原则接口隔离原则里氏替换原则 设计模式单例模式观察者模式策略模式代理模式 原则 单一职责原则 定义: 即一个类只负责一项职责 问题: 类 T 负责两个不同的职责:职责 P1,职责 P2。当…

爆破、批量PoC扫描工具 -- POC-T

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。…

【java】27:java绘图

坐标体系 - 介绍: 下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点个像素;第二个是y坐标,表示当前位置为垂直方向…

视频不够清晰怎么办?教你几种有效方法

在我们日常生活中,有时候我们会遇到不清晰的视频,这给我们带来了很多不便。那么,怎么将不清晰的视频变清晰呢?本文将为您介绍一些常用的软件工具,帮助您提升视频的清晰度。 方法一:使用AI技术 AI技术可以通…

springboot-异步、定时、邮件任务

目录 一,前言 二,异步 2.1,案例: 1,首先创建一个service: 2,Controller: ① 想办法告诉spring我们的异步方法是异步的,所以要在方法上添加注解 Async ②去springboot主程序中开…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

Bentley二次开发教程19-文件及模型管理-参照操作

参照操作 模型参照(*.dgn) 当我们需要与同专业,或者跨专业协同配合时,总是无可避免的需要参照他人的模型。若想通过编程的方式提前将参照模型与指定场景绑定起来,那么就需要掌握模型参照的方法。关于该方法大致的使用…

python创建线程和结束线程

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 python创建线程和结束线程 在 Python 中,线程是一种轻量级的执行单元&#xff…

C++-DAY1

思维导图 有以下定义,说明哪些量可以改变哪些不可以改变? const char *p; const (char *) p; char *const p; const char* const p; char const *p; (char *) const p; char const* const p; const char *p:指针 p 所指向的内容不可改…

【C++庖丁解牛】C++11---右值引用和移动语义

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1 左值引用和右值引用2 左…

是德软件89600 RFID使用笔记

文章目录 1、进入RFID软件:2、RFID软件解调设置项3、如何查看一段指令数据本文是日常工作的笔记分享。 lauch VSA(矢量频谱分析)后会出现以下界面: 当然这是因为频谱仪的输入有信号才显示如下: 否则就显示频谱仪的噪底 这里的设置过程同一般的频谱仪,比如中心频率、span…

逆向修改app就可以游戏充值到账?

hello ,大家好, 现在市场仍然流行着非常多的传奇类游戏私服或者其他类型的游戏私服,随着私服越来越多(很多并不合法),越来越多的人加入了破解,逆向修改,或者代充的队伍并从中获利。这里我给大家分享一下这些做代充的常规的做法,以及大家作为游戏服务器如何避坑做强校验…

ApiHug 的初心-ApiHug101

视频 秒懂 ApiHug -019 HOPE 🔥 H.O.P.E.: Help other people excellent 💝 是这个项目最初的初心 🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ 🏠 gitee github search ApiHug ApiHug 🤗 ApiHug {Post…

数据结构(学习笔记)王道

一、绪论 1.1 数据结构的基本概念 数据:是信息的载体,是描述客观事物属性的数、字符以及所有输入到计算机中并被计算机程序识别和处理的符号的集合。(计算机程序加工的原料)数据元素:数据的基本单位,由若干…

相关电路整理(工程)相关FOC电路整理

1. 基于STM32G4的FOC电机驱动学习板 1.1 防反接电路 电源正确接入时 电流从 VIN 端流向负载,经由 Q3(NMOS) 通向地(GND)。在上电瞬间,由于 MOS 管的体二极管效应,地回路通过体二极管接通。接下来,由于 Vgs…

【sping】在logback-spring.xml 获取项目名称

在日志文件中我们想根据spring.application.name 创建出的文件夹。 也不想死在XML文件中。 application.yml spring:application:name: my-demo logback-spring.xml <springProperty name"application_name" scope"context" source"spring.app…

Unity类银河恶魔城学习记录13-4 p145 Save Skill Tree源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili GameData.cs using System.Collections; using System.Collections.Generic…

网络带宽相关

1.tcp重传率计算 watch -n 5 “cat /proc/net/snmp” 如下博客所讲 https://blog.csdn.net/michaelwoshi/article/details/121189743 2.iperf测试网络带宽 #客户端 #tcp iperf -c 服务端ip -P 4 -b 200M #udp iperf -c 服务端ip -u -P 4 -b 1000M -l 10K #服务端 iperf -s

云架构(五)BBF模式

BFF模式&#xff08;Backends for Frontends pattern&#xff09;- https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends。 创建单独的后台服务用以提供给特定的前端或者接口。当你希望避免为多个接口定制单独的后台时&#xff0c;此模…
最新文章