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中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构ÿ…...
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模型与多元分支模块(Diverse Branch Block)的结合,Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构重新参数化技术。这种技术的核心在于结合多样化的分支,这些分支具有…...
Spring Boot 3 整合 Spring Cache 与 Redis 缓存实战
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
kubeadm 安装k8s1.28.x 底层走containerd 容器
1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新,包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项,所以可以看出来,在发布节奏调整后, 每个 Kubernetes 版本中都会包…...
“分割“安卓用户,对标iOS,鸿蒙崛起~
近期关于**“华为于明年推出不兼容安卓的鸿蒙版本”**的消息传出,引起了业界的热议关注。自从2019年8月,美国制裁下,华为不再能够获得谷歌安卓操作系统相关付费服务,如此情况下,华为“备胎”鸿蒙操作系统一夜转正。 华…...
【Vulnhub 靶场】【hacksudo: ProximaCentauri】【简单 - 中等】【20210608】
1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hacksudo-proximacentauri,709/ 靶场下载:https://download.vulnhub.com/hacksudo/hacksudo-ProximaCentauri.zip 靶场难度:简单 - 中等 发布日期:2021年06月08日 文件大小&…...
share pool的组成
share pool的组成 3块区域:free,library cache,row cache 通过查看v$librarycache视图,可以监控library cache的活动情况,进一步衡量share pool设置是否合理; 其中reloads列,表示对象被重新加载的次数,在一个设置合…...
应用案例 | 基于三维视觉的汽车零件自动化拧紧解决方案
Part.1 引言 随着人们生活水平的提高,汽车作为理想的代步工具,逐渐成为人们生活中不可或缺的一部分。汽车的广泛应用,大大增加了汽车制造业的负荷。因此,如何提高生产效率和汽车性能,成为汽车制造业的首要关注话题。…...
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:static_cast(expression) const_cast dynamic_cast reinterpret_cast C 提供以下几类转换 static_cast:static_cast<type-id>(expression) tatic_cast 主要用于以下几种情况: 用于显式地将一个表达式转换为另一…...
【python、opencv】opencv仿射变换原理及代码实现
opencv仿射变换原理 仿射变换是opencv的基本知识点,主要目的是将原始图片经过仿射变换矩阵,平移、缩放、旋转成目标图像。用数学公式表示就是坐标转换。 其中x,y是原始图像坐标,u,v是变换后的图像坐标。将公式转换为…...
mac本地部署stable-diffusion
下载Homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ①输入“1”选择中科大版本,然后输入Y(YES),直接输入开机密码(不显示)然后回车确认,开始下载 ②…...
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 之后参照:dock…...
如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南
如何用tiny11builder打造轻量Windows 11系统:绕过硬件限制的完整指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 老旧电脑无法流畅运行Windows 11…...
FastAdmin二次开发指南:如何基于这套开源CMS源码定制你的专属内容模型?
FastAdmin二次开发实战:从零构建自定义内容模型 在开源CMS领域,FastAdmin以其基于ThinkPHP的优雅架构和丰富的功能模块,成为众多开发者快速构建后台管理系统的首选。但真正体现其价值的,往往是在面对个性化业务需求时的二次开发能…...
保姆级教程:手把手教你用ONNX Runtime部署YOLOv8-OBB旋转框检测模型(附完整代码)
从零实现YOLOv8-OBB旋转框检测:ONNX Runtime部署全流程实战 旋转目标检测在遥感图像、文档分析等场景中具有独特优势。YOLOv8-OBB作为Ultralytics推出的旋转框检测版本,其部署过程与传统水平框检测存在显著差异。本文将彻底拆解从模型导出到推理优化的完…...
dmview.ocx文件丢失找不到 打不开程序 免费下载方法分享
在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...
Youtu-VL-4B-Instruct基础教程:system message规范写法避免API响应异常
Youtu-VL-4B-Instruct基础教程:system message规范写法避免API响应异常 你是不是在用Youtu-VL-4B-Instruct的API时,偶尔会遇到一些奇怪的响应?比如模型突然不按套路出牌,或者干脆给你返回一些看不懂的内容? 别担心&a…...
别再手动算了!用Matlab RF Toolbox一键搞定S/Z/Y/ABCD参数转换(附3dB电桥实例代码)
射频工程师的救星:Matlab RF Toolbox参数转换全攻略 每次面对S/Z/Y/ABCD参数的手动转换,是不是总有种想摔计算器的冲动?那些复杂的矩阵运算和容易出错的推导过程,简直是在浪费生命。作为一名射频工程师,我深知这种痛苦…...
别再傻傻匀速拖滑块了!用Python模拟真人鼠标轨迹,轻松过Geetest验证码
突破验证码防线:Python模拟人类行为轨迹的实战艺术 验证码系统正变得越来越智能,Geetest等平台已经能够通过分析用户行为模式来区分人类和机器。传统的匀速滑块操作在这些系统面前几乎无所遁形。本文将带你深入理解现代验证码系统的工作原理,…...
AML启动器:智能管理XCOM 2模组的一站式解决方案
AML启动器:智能管理XCOM 2模组的一站式解决方案 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom…...
当人脸识别‘脸盲’时:ReID如何靠‘衣着体态’在安防、零售中找人?
当人脸识别失效时:ReID技术如何通过衣着体态实现精准追踪 在智慧城市建设和零售数字化转型的浪潮中,视频分析技术正面临一个尴尬的现实困境——当人脸识别因遮挡、远距离或背对摄像头等原因失效时,如何继续追踪目标人物?这个问题…...
nlp_structbert_sentence-similarity_chinese-large赋能微信小程序:实现文本查重功能
nlp_structbert_sentence-similarity_chinese-large赋能微信小程序:实现文本查重功能 最近和一位做在线教育的朋友聊天,他提到一个挺头疼的问题:批改学生作文时,经常发现不同学生提交的作业内容高度相似,甚至有大段雷…...
