【网路编程】UDP协议及UDP小练习之聊天室

news2024/11/22 19:30:23

目录

一、InetAddress类的使用

二、UDP协议之发送数据(单播)

三、UDP协议之接收数据

四、UDP小练习之聊天室

五、UDP之单播、组播、广播

(一)组播之发送数据、接收数据

(二)广播之发送数据、接收数据


一、InetAddress类的使用

        获取InetAddress对象,是用来获取一台设备的相关信息。

getByName():确定主机名称的IP地址

getHostName():获取IP地址的主机名

getHostAddress():返回文本显示中的IP地址字符串

import java.net.InetAddress;
import java.net.UnknownHostException;

public class MyInetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //1.获取InetAddress对象
        //ip的对象,一台电脑
        //确定主机名称的IP地址。主机名称可以是机器名称也可以是IP地址
        InetAddress address=InetAddress.getByName("LAPTOP-4R4O0SD4");
        System.out.println(address);
        //获取IP地址的主机名
        String name=address.getHostName();
        System.out.println(name);
        //返回文本显示中的IP地址字符串
        String ip=address.getHostAddress();
        System.out.println(ip);
    }
}

二、UDP协议之发送数据(单播)

package a02UDPdemo;

import java.io.IOException;
import java.net.*;
/*
UDP面向无连接的通信协议
速度快、一次最多发送64K、数据不安全、容易丢失数据
看视频、语音通话、视频会议、

TCP面向连接的通信协议
速度慢。没有大小限制、数据安全
下载安装包、文字聊天、发送邮件
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据

        //1.创建DatagramSocket对象(快递公司)
        //细节:绑定端口,就是通过这个端口往外发送数据
        //空参:所有可用端口随机选择一个
        //有参:指定端口号
        DatagramSocket datagramSocket=new DatagramSocket();
        String str="udp发送数据";
        byte []bytes =str.getBytes();//发送的数据
        InetAddress inetAddress=InetAddress.getByName("127.0.0.1");//要发送到的设备
        int port=10086;//要发送到主机的端口号
        //2.打包数据(DatagramPacket)
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
        //3.发送数据
        datagramSocket.send(datagramPacket);
        //4.释放资源
        datagramSocket.close();
    }
}

 

三、UDP协议之接收数据

package a02UDPdemo;

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

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接收数据

        //1.创建DatagramSocket对象(快递公司)
        //细节:
        //接收的时候一定要绑定端口
        //而且绑定的端口一定要跟发送的端口保持一致
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte [] bytes =new byte[1024];//用于接收数据的数组大小
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
        //该方法是阻塞的,程序执行到receive,会在这里死等,等待发送端发送数据
        System.out.println(1111);
        datagramSocket.receive(datagramPacket);
        System.out.println(2222);//如果发送端没有发送数据,就不会打印2222
        //3.解析数据包
        byte[] data= datagramPacket.getData();
        int len=datagramPacket.getLength();
        int port=datagramPacket.getPort();
        InetAddress address=datagramPacket.getAddress();
        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
        //4.释放资源
        datagramSocket.close();

    }
}

小贴士:先运行send在运行receive 

四、UDP小练习之聊天室

按照下面的要求实现程序:

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

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

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

/**
 * 按照下面的要求实现程序
 * UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
 * UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象
        DatagramSocket datagramSocket=new DatagramSocket();
        while (true) {
            //2.打包数据
            Scanner scanner=new Scanner(System.in);
            System.out.println("请输入您想输入的话");
            String str= scanner.nextLine();
            if("886".equals(str)){
                break;
            }
            byte []bytes=str.getBytes();
            int port=10086;
            InetAddress address=InetAddress.getByName("127.0.0.1");
            DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
            //3.发送数据
            datagramSocket.send(datagramPacket);
        }
        //4.释放资源
        datagramSocket.close();

    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 按照下面的要求实现程序
 * UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
 * UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
 */
public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1.创建对象
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        while (true) {
            datagramSocket.receive(datagramPacket);
            //3.解析数据包
            String ip=datagramPacket.getAddress().getHostAddress();
            String name=datagramPacket.getAddress().getHostName();
            int port= datagramPacket.getPort();
            byte data[]=datagramPacket.getData();
            int length=datagramPacket.getLength();
            //4.打印数据
            System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        }
//        //4.释放资源
//        datagramSocket.close();
    }
}

 

 可以开启多个启动运行来模拟多个设备发送数据,如下图所示,开启三个send类来模拟三个用户,一个receive类模拟聊天室接收数据。先运行send类在运行receive类。

 

五、UDP之单播、组播、广播

(一)组播之发送数据、接收数据

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * UDP发送方式分为:单播、组播、广播
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        组播发送端代码
        组播地址:224.0.0.0~239.255.255.255
        其中224.0.0.0~224.0.0.255为预留的组播地址
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket();
        //2.创建DatagramPacket对象
        String str="您好";
        byte []bytes=str.getBytes();
        int port=10000;
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length,address,port);
        //3.调用MulticastSocket发送数据方法发送数据
        multicastSocket.send(datagramPacket);
        //4.释放资源
        multicastSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo1 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo2 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.1");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class ReceiveMessageDemo3 {
    public static void main(String[] args) throws IOException {
        /*
        组播接收端代码
         */
        //1.创建MulticastSocket对象
        MulticastSocket multicastSocket=new MulticastSocket(10000);
        //2.将当前本机,添加到224.0.0.1这一组中
        InetAddress address=InetAddress.getByName("224.0.0.2");//指定组播地址ip
        multicastSocket.joinGroup(address);
        //3.创建DatagramPacket数据包对象
        byte []bytes=new byte[1024];
        DatagramPacket datagramPacket=new DatagramPacket(bytes, bytes.length);
        //4.接收数据
        multicastSocket.receive(datagramPacket);
        //5.解析资源
        String ip=datagramPacket.getAddress().getHostAddress();
        String name=datagramPacket.getAddress().getHostName();
        int port= datagramPacket.getPort();
        byte data[]=datagramPacket.getData();
        int length=datagramPacket.getLength();
        System.out.println("ip为"+ip+",主机为"+name+",端口号为"+port+"发送了数据:"+new String(data,0,length));
        //6.释放资源
        multicastSocket.close();

    }
}

 

 其中ReceiveMessageDemo3并不会收到发来的数据。因为它指定的组播地址不是send类指定的组播地址。

(二)广播之发送数据、接收数据

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

/**
 * UDP发送方式分为:单播、组播、广播
 */
public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        广播发送端代码
        组播地址:255.255.255.255
         */
        //1.创建DatagramSocket对象
        DatagramSocket datagramSocket=new DatagramSocket();
        String str="udp发送数据";
        byte []bytes =str.getBytes();//发送的数据
        InetAddress inetAddress=InetAddress.getByName("255.255.255.255");//要发送到的设备
        int port=10086;//端口号
        //2.打包数据(DatagramPacket)
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length,inetAddress,port);//有很多传参方式
        //3.发送数据
        datagramSocket.send(datagramPacket);
        //4.释放资源
        datagramSocket.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        /*
        广播接收端代码
         */
        //1.创建DatagramSocket对象
        DatagramSocket datagramSocket=new DatagramSocket(10086);
        //2.接收数据包
        byte [] bytes =new byte[1024];//用于接收数据的数组大小
        DatagramPacket datagramPacket=new DatagramPacket(bytes,bytes.length);//bytes.length表示用数组全部的空间去接收数据
        datagramSocket.receive(datagramPacket);
        //3.解析数据包
        byte[] data= datagramPacket.getData();
        int len=datagramPacket.getLength();
        int port=datagramPacket.getPort();
        InetAddress address=datagramPacket.getAddress();
        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发出的");
        //4.释放资源
        datagramSocket.close();
    }
}


 

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

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

相关文章

工业相机丢包排查步骤

机器视觉康耐视智能相机Insight-缺失外观检测 第一步:检查PC环境设置 l巨型帧/巨帧数据包是否已经设置成9KB,巨型帧在“本地连接->属性->配置->高级”的界面中 效果验证:如之前未配置9KB,请配置9KB后验证效果 l请确认现场电脑上是否有360安全卫士、360杀毒软件等…

软考A计划-电子商务设计师-电子商务系统规划

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

皮卡丘暴力破解

1.基于表单的暴力破解 随便输个账号和密码,用bp抓包 点击Action发送到Intruder,选中要爆破的位置 加入字典(字典需下载) 点击“Start attack”,开始爆破 发现这行长度和其他不一样,admin即为用户名,123456即…

033:Mapbox GL变换地图底图语言

第033个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中变换地图底图的语言。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共74行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

华为芯片基地旁,龙华科技小镇大水坑片区城市更新单元旧改项目

项目位置:龙华观澜大水坑社区,位于梅观创新走廊九龙山产学研片区内 占地面积:总面积198万平方米,其中项目第一期60万平米开 发 商: 华润集团申报主体:华润置地项目:龙华科技小镇大水坑片区城市…

chatgpt赋能python:Python排序——让列表按大小排列

Python排序——让列表按大小排列 在Python编程的世界中,排序是一个非常重要的事情。不论是处理数据,还是进行各种算法实现,都需要将元素按照一定的方式排列。 而其中最常见的排序方式之一便是升序排序。升序排序顾名思义,就是将…

Leetcode 56 合并区间

Leetcode 56 合并区间 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/merge-intervals/description 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 以数组 intervals 表示若干个区间…

chatgpt赋能python:Python升序排序sort:让你的数据更易管理

Python升序排序sort:让你的数据更易管理 如果你是一位熟练的Python开发人员,你肯定听说过Python内置的sort()函数。这个函数是用来对列表、元组和可迭代对象进行排序的。 在本篇文章中,我们将着重介绍升序排序,探讨sort()函数的…

文件上传、MD5加密与验证码的功能实现

UUID工具类 1.概述:UUID 是通用唯一识别码(Universally Unique Identifier)的缩写。UUID 让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。 是一个软件建构的标准&#x…

权限管理与jwt鉴权

权限管理与jwt鉴权 学习目标: 理解权限管理的需求以及设计思路实现角色分配和权限分配 理解常见的认证机制 能够使用JWT完成微服务Token签发与验证 权限管理 需求分析 完成权限(菜单,按钮(权限点),A…

【5.26 代随_38day】 动态规划基础理论、斐波那契数、爬楼梯、使用最小花费爬楼梯

动态规划基础理论、斐波那契数、爬楼梯、使用最小花费爬楼梯 动态规划基础理论1.动态规划的五部曲 斐波那契数1.动态规划的方法代码 爬楼梯图解步骤代码 使用最小花费爬楼梯图解步骤代码 动态规划基础理论 视频连接:动态规划解题方法论大曝光 !| 理论基…

皮卡丘../../(目录遍历)/敏感信息泄露/PHP反序列化

一.目录遍历 1.概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中…

ArrayList的底层实现原理

目录 一、知识点回顾二、ArrayList 的 add() 和 remove() 的实现2.1 list.add(e) 实现原理2.2 list.remove() 实现原理 ArrayList的底层是通过数组实现的。 一、知识点回顾 数组特点: 存储区间是连续的,且占用内存严重,空间复杂度很大&…

第3节:cesium 离线地图下载(含教程+视频)

主要介绍两种方式。 第一种 望远网(web端地图下载) web端地图下载 第一步:选择资源发布方 第二步:选择地图类型以及路网 第三步:选择区域 支持区域选择和自定义区域两种方式 第四步:右键下载 提示:超过100个瓦片需要购买VIP

web前端 --- BOM编程、DOM编程

BOM编程(browser object model -- 浏览器对象模型) BOM给JavaScript提供用来操作浏览器的若干的"方法" 操作 在 js 看来,一个完整的浏览器包含如下组件: window窗口 // 整个浏览器的窗口 |-- history …

论文笔记--Efficient Estimation of Word Representations in Vector Space

论文笔记--Efficient Estimation of Word Representations in Vector Space 1. 文章简介2. 文章概括3 文章重点技术3.1 NNLM(Neural Network Language Model)3.1.1 NNLM3.1.2 RNNLM(Recurrent Neural Net Language Model) 3.2 Continuous Bag-of-Words Model(CBOW)3.3 Continuo…

皮卡丘Over Permission

1.越权漏洞概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了不合理的权限校验规则导致的。 一般越权漏洞容易出现在权限页面(需要登录的页面…

省三医院新门诊大楼网络安全建设项目实施方案

省三医院新门诊大楼网络安全建设项目实施方案 甲方:省三医院 乙方:武汉埃郭信息技术有限公司1组吴冰冰 项目背景 省三医院新建一栋门诊大楼,地址位于原三医院东南处空地。为了响应国家建设数字医疗,构建医联网、医共体的号召&…

不要图片?CSS实现圆角边框渐变色+背景透明

前言 👏不要图片?CSS实现圆角边框渐变色背景透明,最近在工作中常常实现这些效果,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现原理 border-image: border-image CSS …

python基本操作3(速通版)

目录 一、字典 1.字典定义 2.字典的访问 3.字典的遍历 4.字典删除 5.字典练习 6.有序字典 7.集合 8.类型转化问题 9.公共方法 二、列表推导式 1.基本操作 2.在循环中使用if 三、组包和拆包 1.组包拆包基本应用 2.拆包的字典问题 四、python函数的一些特性 1.函…