当前位置: 首页 > news >正文

Java第二十一章总结

网络编程三要素

ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议

InetAddress类

表示Internet协议地址

        //返回InetAddress对象
        InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");

        //返回计算机名
        String hostName = byName.getHostName();

        //返回Ip地址
        String hostAddress = byName.getHostAddress();

端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败

协议
计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议
 用户数据报协议(User Datagram Protocol)
 UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
 UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

TCP协议
 传输控制协议 (Transmission Control Protocol)

 TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

 在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

三次握手:
  第一次握手,客户端向服务器端发出连接请求,等待服务器确认

  第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

  第三次握手,客户端再次向服务器端发送确认信息,确认连接

UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket

构造方法

 相关方法

        //创建一个发送数据Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建一个包,用于存放要发送的数据
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
        //发送数据
        ds.send(dp);
        ds.close();
      

 

UDP接受数据

构造方法

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

相关方法

        //创建一个接收端的Socket对象
        DatagramSocket ds=new DatagramSocket(8888);
        
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);
        
        //接收数据
        ds.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ds.close();
 

UDP三种通讯方式

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

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

广播:一个主机对整个局域网所有主机通信

组播代码实现:

//发送端
        //创建发送端的Socket对象
        DatagramSocket ds=new DatagramSocket();
        //创建数据包,
        byte[] bys="hello".getBytes();
        DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
        //发送
        ds.send(dp);
        //释放资源
        ds.close();
        
//========================================================
//接收端

        //创建一个接收端的Socket对象
        MulticastSocket ms=new MulticastSocket(8888);
        //创建一个接受数据的包
        byte[] bys=new byte[1024];
        DatagramPacket dp=new DatagramPacket(bys,bys.length);

        //把当前电脑绑定一个组播地址
        ms.joinGroup(InetAddress.getByName("224.0.1.1"));

        //接收数据
        ms.receive(dp);
        //获取数据
        byte[] data = dp.getData();
        //dp.getLength是接受到的数据长度
        System.out.println(new String(data,0,dp.getLength()));
        ms.close();

TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类

Socket构造方法


相关方法方

        //创建一个客户端Socket对象
        Socket s=new Socket("127.0.0.1",8888);
        //获取输出流,输出数据
        OutputStream outputStream = s.getOutputStream();
        outputStream.write("hello".getBytes());
        //释放资源
        s.close();
 

TCP接收数据

构造方法

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

相关方法

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

        //创建服务器端ServerSocket对象
        ServerSocket ss=new ServerSocket(8888);
        //监听
        Socket accept = ss.accept();
        //创建一个输入流对象接收数据
        InputStream inputStream = accept.getInputStream();
        byte[] bytes=new byte[1024];
        int len=inputStream.read(bytes);
        String data =new String(bytes,0,len);
        System.out.println(data);
        accept.close();
        ss.close();
 

文件上传

从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地

 

//客户端

   //获取客户端Socket对象
        Socket s = new Socket("127.0.0.1", 8888);
        //从本地读取要上次的文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
        OutputStream os = s.getOutputStream();
        byte[] bys = new byte[1024];
        int i;
        while ((i = bis.read(bys)) != -1) {
            // os.write(i);
            os.write(bys, 0, i);
        }

        os.flush();

        //给服务器一个结束标记,标识已经传输完毕
        s.shutdownOutput();

        //获取服务器给回的信息
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }

        //释放资源
        bis.close();
        s.close();

//======================================

//服务器端

 //创建服务器ServerScoket对象
        ServerSocket ss = new ServerSocket(8888);
        //开始监听
        Socket s = ss.accept();
        //接受客户端数据
        InputStream is = s.getInputStream();
        //创建一个字符缓冲流保存接受的数据
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
        int len;
        byte[] bys = new byte[1024];
        while ((len = is.read(bys)) != -1) {
            bos.write(bys, 0, len);
        }
        //告诉客户端已经接受完毕
        s.shutdownInput();

        //给客户端返回“上传成功信息”
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        //释放资源
        bos.close();
        s.close();
        ss.close();


 

相关文章:

Java第二十一章总结

网络编程三要素 ip地址:计算机在网络中的唯一标识 端口:应用程序在计算机中唯一标识 协议:通信协议,常见有UDP和TCP协议 InetAddress类 表示Internet协议地址 //返回InetAddress对象 InetAddress byName InetAddress.…...

【keil备忘录】2. stm32 keil仿真时的时间测量功能

配置仿真器Trace内核时钟为单片机实际的内核时钟,需要勾选Enable设置,设置完成后Enable取消勾选也可以,经测试时钟频率配置仍然生效,此处设置为48MHZ: 时间测量时必须打开register窗口,否则可能不会计数 右下角有计…...

图的存储(邻接矩阵,边集数组,邻接表,链式前向星)

目录 🌼图的存储 (1)邻接矩阵 (2)边集数组 (3)邻接表 (4)链式前向星 😀刷题 🐍最大节点 🐍有向图 D 和 E 🐍奶牛…...

Linux 基础知识整理(二)

Linux系统目录结构 Linux采用的是树型结构。最上层是根目录,其他的所有目录都是从根目录出发而生成的。微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构&#xff…...

2024年值得关注的8个未来数据库

2024年值得关注的8个未来数据库 关系型数据库管理系统在数据库技术领域占据主导地位已经多年了。当SQL在1970年代首次出现时,关系型数据库管理系统的使用和受欢迎程度迅速提升。很快,MySQL成为了大多数公司和团队首选的数据库。 然而,2023年…...

C++新经典模板与泛型编程:将trait类模板用作模板参数

将trait类模板用作模板参数 template<typename T> struct SumFixedTraits;template<> struct SumFixedTraits<char> {using sumT int;static sumT initValue() {return 0;} };template<> struct SumFixedTraits<int> {using sumT __int64;sta…...

BUUCTF-[GYCTF2020]FlaskApp flask爆破pin

这道题不需要爆破也可以getshell ssti都给你了 {{((lipsum.__globals__.__builtins__[__import__](so[::-1])[popen]("\x63\x61\x74\x20\x2f\x74\x68\x69\x73\x5f\x69\x73\x5f\x74\x68\x65\x5f\x66\x6c\x61\x67\x2e\x74\x78\x74")).read())}} 但是学习记录一下pin…...

web前端实现LED功能、液晶显示时间、数字

MENU 效果演示html部分JavaScript部分css部分 效果演示 html部分 <div id"app"><!-- 页面 --><div class"time-box"><!-- 时 --><div class"house-box"><bit-component :num"houseTem"></bit…...

YOLOv8改进 | 2023 | DiverseBranchBlock多元分支模块(有效涨点)

一、本文介绍 本文带来的改进机制是YOLOv8模型与多元分支模块&#xff08;Diverse Branch Block&#xff09;的结合&#xff0c;Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构重新参数化技术。这种技术的核心在于结合多样化的分支&#xff0c;这些分支具有…...

Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…...

kubeadm 安装k8s1.28.x 底层走containerd 容器

1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新&#xff0c;包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项&#xff0c;所以可以看出来&#xff0c;在发布节奏调整后&#xff0c; 每个 Kubernetes 版本中都会包…...

“分割“安卓用户,对标iOS,鸿蒙崛起~

近期关于**“华为于明年推出不兼容安卓的鸿蒙版本”**的消息传出&#xff0c;引起了业界的热议关注。自从2019年8月&#xff0c;美国制裁下&#xff0c;华为不再能够获得谷歌安卓操作系统相关付费服务&#xff0c;如此情况下&#xff0c;华为“备胎”鸿蒙操作系统一夜转正。 华…...

【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶场下载&#xff1a;https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月08日 文件大小&…...

share pool的组成

share pool的组成 3块区域&#xff1a;free,library cache,row cache 通过查看v$librarycache视图&#xff0c;可以监控library cache的活动情况&#xff0c;进一步衡量share pool设置是否合理; 其中reloads列&#xff0c;表示对象被重新加载的次数&#xff0c;在一个设置合…...

应用案例 | 基于三维视觉的汽车零件自动化拧紧解决方案

​Part.1 引言 随着人们生活水平的提高&#xff0c;汽车作为理想的代步工具&#xff0c;逐渐成为人们生活中不可或缺的一部分。汽车的广泛应用&#xff0c;大大增加了汽车制造业的负荷。因此&#xff0c;如何提高生产效率和汽车性能&#xff0c;成为汽车制造业的首要关注话题。…...

Redis server启动源码

入口main函数 src/redis.c文件main函数 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化库 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//设置本地时间setl…...

C++基础 强制转换

目录 static_cast&#xff1a;static_cast(expression) const_cast dynamic_cast reinterpret_cast C 提供以下几类转换 static_cast&#xff1a;static_cast<type-id>(expression) tatic_cast 主要用于以下几种情况&#xff1a; 用于显式地将一个表达式转换为另一…...

【python、opencv】opencv仿射变换原理及代码实现

opencv仿射变换原理 仿射变换是opencv的基本知识点&#xff0c;主要目的是将原始图片经过仿射变换矩阵&#xff0c;平移、缩放、旋转成目标图像。用数学公式表示就是坐标转换。 其中x&#xff0c;y是原始图像坐标&#xff0c;u&#xff0c;v是变换后的图像坐标。将公式转换为…...

mac本地部署stable-diffusion

下载Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ①输入“1”选择中科大版本&#xff0c;然后输入Y(YES)&#xff0c;直接输入开机密码&#xff08;不显示&#xff09;然后回车确认&#xff0c;开始下载 ②…...

dockers安装rabbitmq

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQhttps://www.rabbitmq.com/ Downloading and Installing RabbitMQ — RabbitMQ docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.12-management 之后参照&#xff1a;dock…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...