JAVA网络编程(一)
一、什么是网络编程
定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
应用场景:即时通信,网游,邮件等
不管什么场景,都是计算机与计算机之间通过网络在进行数据传输
java提供一个java.net包,可以帮助我们开发网络应用程序。
二、常见的网络应用程序架构
CS架构是指在远端有一个服务器Server,用户需要在本地下载一个客户端Client。
BS架构是指远端有一个服务器,用户通过浏览器进行访问。
BS架构的优缺点
优点:
①不需要开发客户端,只需要页面和服务端
②用户不需要下载应用,只需要在浏览器访问
缺点:
①如果应用中的资源体积过大,那么用户体验将受到影响,比如图片过大,浏览器就要加载一会儿才能显示。
CS架构的优缺点
优点:
①画面可以做的非常精美,不用担心传输慢,因为需要提前下载资源包到本地
缺点:
②需要开发客户端和服务端,工作量加大
③用户需要下载安装和更新
三、网络编程三要素
IP、端口号、协议
IP
全称:Internet Protocol,是互联网协议地址,也称ip地址,是分配给上网设备的数字标签。
常见的IP分类有IPv4和IPv6两种。
IPv4
IPv6
总结:
IPv4是如何节约分配的?
以网吧举例,网吧里面的电脑很多,不可能为每一台电脑设置一个公网ip,所以就出现了下面的方案:
所有电脑共用一个公网ip,每台电脑拥有一个局域网ip
特殊的Ip地址
127.0.0.1,也可以是localhost:是回送地址,也称本地回环地址,也称本机ip,永远只会寻找当前所在本机。
提问:
如果192.168.1.100是我电脑的ip地址,那么这个ip和127.0.0.1是一样的吗?
答案:不是的,192.168.1.100是局域网给你的电脑分配的ip地址,而127.0.0.1是只代表本机的地址
举例:
使用电脑向192.168.1.100发送消息,数据会先经过路由器,然后通过路由器发送数据给我的电脑。
并且如果我的电脑换了一个局域网环境,比如换了一个路由器,那么我的电脑的ip地址可能会发生改变。
如果使用127.0.0.1,我的电脑就不会向路由器发送信息,信息在通过网卡的时候就会发现这条数据是发送给回环地址的,直接发送给我的电脑。
常见的cmd命令
总结
InetAddress对象
InetAddress类没有公有的构造方法,只能通过getByName(String name)方法获取InetAddress对象。
InetAddress对象表示一个IP,一个IP对应着一台网络中的设备,所以InetAddress对象也可以表示一台设备。
当获取到这台设备的InetAddress对象时,就可以给这个对象发送消息了
/*** @author Watching* * @date 2023/5/26* * Describe:* static InetAddress getByName(String host) 确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址* String getHostName() 获取此ip地址的主机名* String getHostAddress() 返回文本显示中的ip地址字符串*/
public class MyInetAddressDemo1 {public static void main(String[] args) throws UnknownHostException {//InetAddress 表示ip的对象,而ip有表示一台联网设备,所以这也能表示一台设备对象InetAddress address = InetAddress.getByName("DESKTOP-DHVQ061");System.out.println(address);String hostAddress = address.getHostAddress();System.out.println(hostAddress);String hostName = address.getHostName();System.out.println(hostName);}
}
端口号
端口号时应用程序在一台设备中的唯一标识
端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口用于一些知名的网络服务或应用,所以我们自己的程序应该使用1024以上的端口号
一个端口号只能被一个应用程序使用
协议
计算机网络中,连接和通信的规则被称为网络通信协议。
OSI参考模型
数据从应用层一直传输到物理层,转为可网络传递的二进制形式,传递另外一台电脑上,再由下到上到应用层,转为原始数据。
TCP/IP协议
TCP/IP模型将应用层、表示层、会话层合为一层,数据链路层、物理层合为一层。
TCP/IP模型减少了流程复杂度,减少了资源消耗
我们重点学习传输层的TCP和UDP协议。
UDP协议
UDP协议的特点就是速度快,面向无连接, 不管是否连接成功,都会发送数据,应用场景比如视频聊天,电话等,就算出现了连接失败,也只是会出现卡顿的情况
测试UDP传输数据
步骤:
1.创建DatagramSocket对象,建立连接
2.打包数据,需要指定接收端口
3.发送数据
4.关闭连接
/*** @author Watching* * @date 2023/5/26* * Describe:*/
public class SendMessageDemo1 {public static void main(String[] args) throws IOException {//发送数据//1.创建DatagramSocket对象//细节://绑定端口,以后我们就是通过这个端口往外发送//空参:所有可用的端口中随机一个进行使用//有参:指定端口号进行绑定DatagramSocket datagramSocket = new DatagramSocket();//2.打包数据String str = "你好威啊";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);//3.发送数据datagramSocket.send(dp);//4.关闭连接datagramSocket.close();}
}
在打包数据的时候,DatagramPacket里面有很多构造器,可以根据需要选择不同的构造器。
测试UDP接收数据
步骤:
1.创建DatagramSocket对象建立连接,端口要与发送者的目的端口一致
2.创建DatagramPacket对象接收数据
3.通过DatagramPacket对象获取数据、数据长度、发送者IP、发送者端口号等信息
4.断开连接
/*** @author Watching* * @date 2023/5/27* * Describe:*/
public class ReceiveMessageDemo {public static void main(String[] args) throws IOException {//1.创建socket连接,端口要与发送消息的要相同DatagramSocket ds = new DatagramSocket(10086);//2.接受数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//该方法是阻塞式的方法,会一直阻塞直到接受到消息ds.receive(dp);//3.解析数据包byte[] data = dp.getData();int length = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println(new String(data,0, length));System.out.println("数据是从 [" + address + "]" + "发送来的");System.out.println("端口是 [" + port + "]");}
}
接收数据时使用的DatagramSocket对象的 receive(DatagramPacket dp) 方法,这个方法是阻塞式的,直到接收到传来的消息才会停止阻塞。
UDP的三种通信方式
单播
单对单传输
组播
一组设备接收消息
广播
所有设备都能接收消息
UDP三种通信方式的代码实现
单播
前面我们编写的代码就是单播
组播
发送端:
步骤:
①创建组播连接,使用MultiCastSocket类
②创建DatagramPacket对象打包数据,需要指定接收端口
③发送消息
④关闭连接
/*** @author Watching* * @date 2023/5/27* * Describe:测试组播发送代码**/
public class SendMessageDemo2 {public static void main(String[] args) throws IOException {//1.创建组播连接MulticastSocket mcs = new MulticastSocket();//2.创建数据包打包数据String str = "你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);//3.发送消息mcs.send(dp);//4.关闭连接mcs.close();}
}
接收端:
步骤:
①创建组播连接,使用MultiCastSocket
②将当前连接加入组播地址
③创建DatagramPacket对象接收数据
④解析数据
⑤关闭连接
/*** @author Watching* * @date 2023/5/27* * Describe:接收组播消息*/
public class ReceiveMessageDemo2 {public static void main(String[] args) throws IOException {//1.建立mcs连接,并且填写发送端的端口MulticastSocket mcs = new MulticastSocket(10086);//2.将当前本机连接加入组播InetAddress address = InetAddress.getByName("224.0.0.1");mcs.joinGroup(address);//3.创建DatagramPacket接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//4.接收数据mcs.receive(dp);//5.解析数据int port = dp.getPort();InetAddress ip = dp.getAddress();int length = dp.getLength();byte[] data = dp.getData();System.out.println(new String(data, 0, length));System.out.println("数据来自 [" + ip + "] 端口 [" + port + "]");//5.关闭连接mcs.close();}
}
可以多创建两个类,并运行他们,当发送端的代码执行后,每个添加进组播的连接都能接收到数据
广播
将单播的代码创建数据包DatagramPacket时,将发送的地址改为255.255.255.255就成了广播,局域网中的所有设备都能受到消息。
TCP协议
TCP协议的特点就是面向连接,要在确保连接成功之后才会传输数据,应用场景比如下载软件,发送邮件等。下载软件丢失了数据,可能会导致软件安装不成功,发送邮件丢失数据可能会导致邮件内容错乱。
TCP通信程序
客户端代码编写步骤:
①创建客户端Socket对象与指定服务端连接
Socket(String host,int port);
②获取输出流,写数据
OutputStream getOutputStream
③释放资源
/*** @author Watching* * @date 2023/5/27* * Describe:tcp协议客户端*/
public class Client {public static void main(String[] args) throws IOException {//tcp协议发送数据//1.创建socket连接对象//细节:创建对象的同时会连接服务端,如果连接不上,会直接报错 Exception in thread "main" java.net.ConnectException: Connection refused: connectSocket socket = new Socket("127.0.0.1",10086);//这行代码就是在创建连接(三次握手//2.从连接通道中获取输出流,将数据输出给服务端OutputStream outputStream = socket.getOutputStream();String str = "你好!";outputStream.write(str.getBytes());//3.关闭资源outputStream.close();socket.close();//断开连接,四次挥手协议,保证连接通道中的数据已经处理完成了}
}
服务端代码编写步骤:
①创建服务器端的socket对象(ServerSocket)
ServerSocker(int port)
②监听客户端连接,返回Socket对象
Socket accept()
③获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
④释放资源
/*** @author Watching* * @date 2023/5/27* * Describe:tcp协议服务端*/
public class Server {public static void main(String[] args) throws IOException {//服务端 接收数据//1.创建服务端连接ServerSocket ss = new ServerSocket(10086);//需要绑定一个端口号,以供客户端访问//2.监听客户端的连接Socket accept = ss.accept();//accept方法也是一个阻塞式的方法//3.从连接通道中获取输入流InputStream is = accept.getInputStream();byte[] bytes = new byte[1024];int len;while ((len = is.read(bytes)) != -1) {System.out.println(new String(bytes,0,len));}//4.释放资源is.close();ss.close();}
}
3次握手,4次挥手
3次握手建立连接:
4次挥手断开连接:
总结
相关文章:

JAVA网络编程(一)
一、什么是网络编程 定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输。 应用场景:即时通信,网游,邮件等 不管什么场景,都是计算机与计算机之间通过网络在进行数据传输 java提供一…...

Python 线程队列
文章目录 Python 中的线程在 Python 中使用队列限制线程 本篇文章将介绍限制 Python 中的活动线程数。 Python 中的线程 Python 中的线程允许多个执行线程在单个进程中同时运行。 每个线程独立于其他线程运行,允许并发执行并提高性能。 线程对于执行受 I/O 限制或…...

创建web后端程序(servlet程序搭建)
目录 一、Servlet概述 二、创建servlet程序 1.创建类继承HttpServlet 2.重写HttpServlet类中 service、destroy、init方法 3.重新启动服务器 一、Servlet概述 Server Applet的简称,用Java编写的服务器端的程序。它运行在web服务器中,web服务器负责…...

【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码
创建项目我们不多说,可以选择默认的,也可以用你们现有的项目。注意章节1和章节2请一起看! 章节1: commit规范 husky lint-staged格式化代码 章节2: husky 检测是否有未解决的冲突 预检查debugger 自动检查是否符合commit规范 前言&#x…...

【入门】拐角III
【入门】拐角III Description 输入整数N,输出相应方阵。 Input 一个整数N。( 0 < n < 10 ) Output 一个方阵,每个数字的场宽为3。 Sample Input 1 5 Sample Output 1 5 5 5 5 55 4 4 4 45 4 3 3 35 4 3 2 25 4…...

如何使用 Fail2ban 防止对 Linux 的暴力攻击?
在当今数字化世界中,网络安全成为了一个极其重要的话题。Linux 作为一种广泛使用的操作系统,也面临着各种网络攻击的风险,包括暴力攻击、密码破解和恶意登录等。为了保护 Linux 系统的安全,我们可以使用 Fail2ban 这样的工具来防止…...

2023年,真的别裸辞....
作为IT行业的大热岗位——软件测试,只要你付出了,就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的,但放眼望去,哪个工作不是这样的呢?会有哪家公司愿意养一些闲人呢?…...

规则引擎架构-基于easy-rules
目录 概念理解实例和编码抽象出2条规则简单的规则引擎事实1的处理事实2的处理 easy-rules 规则的抽象和执行事实描述规则的抽象默认的规则 动态代理执行规则和动作规则的执行:org.jeasy.rules.core.DefaultRulesEngine#doFirepublic class RuleProxy implements Inv…...

【数据结构】第七周
目录 稀疏矩阵快速转置 三元组的矩阵加法 九宫格数独游戏 数组主元素 螺旋数字矩阵 蛇形矩阵 数组循环右移K位 稀疏矩阵快速转置 【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存…...

人体三维重构论文集合:awesome 3d human reconstruction
A curated list of related resources for 3d human reconstruction. Your contributions are welcome! Contents papers AIGCnerf or pifugeo fusionphoto3D human whole body3D human...

揭秘Redis持久化原理,探索fork与Copy-on-Write的魔法!
大家好,我是小米,今天我将和大家一起探索Redis持久化原理中的两个关键概念:fork和Copy-on-Write。这两个概念对于理解Redis的数据持久化机制至关重要。让我们一起来揭开这些技术的神秘面纱吧! Redis持久化简介 在开始之前&#…...

应届生如何提高职场竞争能力
摘要: 应届生面对竞争激烈的职场,需要不断提高自身的职业素养和竞争能力,才能在激烈的竞争中脱颖而出。本文从积极心态的培养、专业知识的优化、职业规划的制定、团队协作的加强和自我拓展的开展五个方面,提出了提高应届生职场竞争…...

ISIS 实验
(1)拓扑图 2)需求: -实现PC1和PC2的通信 3)配置步骤: -配置接口IP地址 -开启ISIS---类似于在OSPF中创建进程 -配置NET地址---类似于在OSPF中创建区域,指定Router-id -在接口上启用ISIS--类似于在OSPFv2中用ne…...

国产系统:麒麟之人大金仓数据库部署
一、基本信息和资源 1.1 查看服务器信息 [root7PGxjKPL4 ~]# cat /etc/*release Kylin Linux Advanced Server release V10 (Sword) DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper DISTRIB_DESCRIPTION"Kylin V10" DISTRIB_KYLIN_RELEASEV10 DISTRI…...

flink1.17.0 集成kafka,并且计算
前言 flink是实时计算的重要集成组件,这里演示如何集成,并且使用一个小例子。例子是kafka输入消息,用逗号隔开,统计每个相同单词出现的次数,这么一个功能。 一、kafka环境准备 1.1 启动kafka 这里我使用的kafka版本…...

【华为OD机试】数组组成的最小数字【2023 B卷|100分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述: 给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述: 一行用半角逗号分割的字符串记录的整型数…...

Exponential Loss 中的关于indicator 函数的一个恒等式
− x y 2 I ( x ≠ y ) − 1 -xy2\mathbf{ I}(x \ne y)-1 −xy2I(xy)−1 其中 I \mathbf{ I} I 是 indicator 函数, 定义域 为True ,函数值为 1 反之为 0 x,y 都 可以取值 {-1,1} 证明过程见下表: xy左式右式-1-1-1-111-1-1-11111-111...

【机器学习】浅析过拟合
过度拟合 我们来想象如下一个场景:我们准备了10000张西瓜的照片让算法训练识别西瓜图像,但是这 10000张西瓜的图片都是有瓜梗的,算法在拟合西瓜的特征的时候,将西瓜带瓜梗当作了一个一般性的特征。此时出现一张没有瓜梗的西瓜照片…...

尝试在UNet的不同位置添加SE模块
目录 (1)se-unet01(在卷积后,下采样前,添加SE模块) (2)se-unet02(在卷积后,上采样前,添加SE模块) (3)se-un…...

JVM垃圾回收篇之相关概念和算法
垃圾回收相关概念 什么是垃圾 垃圾就是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收掉的垃圾,如果不及时进行清理,越积越多就会导致内存溢出. 为什么需要GC 不进行回收,早晚会导致内存溢出,Java自动管理垃圾回收,不需要开发人员手动干预,这就有可能导致开…...

(学习日记)2023.04.27
写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…...

亚马逊CPC广告每日该怎么调整?
01 CPC广告需要每日调整吗? 其实,亚马逊广告是不建议每天都做过多调整的。 为什么呢?调整太频繁了,看不到每天调整的结果是不是? 什么时候需要调整呢? 就是广告指标,比如说曝光、点击、转化率情…...

ffmpeg下载及ffmpy3安装使用
ffmpeg下载及ffmpy3安装使用 1.下载ffmpeg 进入网址:https://www.gyan.dev/ffmpeg/builds/ 在release builds中下载ffmpeg-release-full.7z 下载好后解压到自己想存放的目录,例如:D:\Tool\ffmpeg-6.0-full_build 2.配置环境变量 右键此电…...

设计模式之~原型模式
定义:用原型实例指导创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。 优点: 一般在初始化的信息不发生变化的情况下,克隆是最…...

多传感器融合SLAM --- 8.LIO-SAM基础知识解读
目录 1 惯性测量单元简介及预积分 1.1 IMU 器件介绍及选型建议 1.2 IMU状态传递方程...

多模态大模型时代下的文档图像智能分析与处理
多模态大模型时代下的文档图像智能分析与处理 0. 前言1. 人工智能发展历程1.1 传统机器学习1.2 深度学习1.3 多模态大模型时代 2. CCIG 文档图像智能分析与处理论坛2.1 文档图像智能分析与处理的重要性和挑战2.2 文档图像智能分析与处理高峰论坛2.3 走进合合信息 3. 文档图像智…...

SAP-MM-内向外向交货单
1、内向&外向交货单概念 外向交货(outbound delivery)是用在客户与企业之间的交货单,而内向交货(inbound delivery)则是用在供应商与企业之间的交货单;换言之,外向交货多用于SD 模块&#…...

Mysql - date、datetime、timestamp 的区别
date、datetime 的区别 顾名思义,date 日期,datetime 日期时间,所以 date 是 datetime 的日期部分MySQL 以 格式检索和显示 datetime 值 YYYY-MM-DD hh:mm:ss datetime 支持的日期时间范围 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 d…...

离散数学_十章-图 ( 4 ):图的表示和图的同构
📷10.4 图的表示和图的同构 1. 图的表示1.1 邻接表1.1.1 简单图的邻接表1.1.2 有向图的邻接表 1.2 邻接矩阵❗在邻接表和邻接矩阵之间取舍1.3 关联矩阵 2. 图同构3. ⚡判断两个简单图是否同构 图的表示方式有很多种,选择最方便的表示有助于对图的处理~ …...

MySQL锁的分类
MySQL锁的分类 全局锁 表级锁 ● 表锁 ● 元数据锁,Meta Data Lock,MDL锁 ● 意向锁 ● AUTO_INC 锁 行级锁(Innodb引擎牛比的地方) ● record lock,记录锁,也就是仅仅把一条记录给锁上了 ● gap lock,间隙锁ÿ…...