Java之UDP,TCP的详细解析
练习四:文件名重复
public class UUIDTest { public static void main(String[] args) { String str = UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } ```public class Client {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//1. 创建Socket对象,并连接服务器Socket socket = new Socket("127.0.0.1",10000);
//2.读取本地文件中的数据,并写到服务器当中BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}
//往服务器写出结束标记socket.shutdownOutput();
//3.接收服务器的回写数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println(line);
//4.释放资源socket.close();
}
}
public class Server {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//1.创建对象并绑定端口ServerSocket ss = new ServerSocket(10000);
//2.等待客户端来连接Socket socket = ss.accept();
//3.读取数据并保存到本地文件中BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();//4.回写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();
//5.释放资源socket.close();ss.close();}
}
练习五:服务器改写为多线程
服务器只能处理一个客户端请求,接收完一个图片之后,服务器就关闭了。
优化方案一:
使用循环
弊端:
第一个用户正在上传数据,第二个用户就来访问了,此时第二个用户是无法成功上传的。
所以,使用多线程改进
优化方案二:
每来一个用户,就开启多线程处理
public class Client {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//1. 创建Socket对象,并连接服务器Socket socket = new Socket("127.0.0.1",10000);
//2.读取本地文件中的数据,并写到服务器当中BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}
//往服务器写出结束标记socket.shutdownOutput();
//3.接收服务器的回写数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println(line);
//4.释放资源socket.close();
}
}
public class Server {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//1.创建对象并绑定端口ServerSocket ss = new ServerSocket(10000);
while (true) {//2.等待客户端来连接Socket socket = ss.accept();
//开启一条线程//一个用户就对应服务端的一条线程new Thread(new MyRunnable(socket)).start();}
}
}
public class MyRunnable implements Runnable{
Socket socket;
public MyRunnable(Socket socket){this.socket = socket;}
@Overridepublic void run() {try {//3.读取数据并保存到本地文件中BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();//4.回写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();} catch (IOException e) {e.printStackTrace();} finally {//5.释放资源if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
练习六:线程池改进
public class Client {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//1. 创建Socket对象,并连接服务器Socket socket = new Socket("127.0.0.1",10000);
//2.读取本地文件中的数据,并写到服务器当中BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet\\clientdir\\a.jpg"));BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes)) != -1){bos.write(bytes,0,len);}
//往服务器写出结束标记socket.shutdownOutput();
//3.接收服务器的回写数据BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = br.readLine();System.out.println(line);
//4.释放资源socket.close();
}
}
public class Server {public static void main(String[] args) throws IOException {//客户端:将本地文件上传到服务器。接收服务器的反馈。//服务器:接收客户端上传的文件,上传完毕之后给出反馈。
//创建线程池对象ThreadPoolExecutor pool = new ThreadPoolExecutor(3,//核心线程数量16,//线程池总大小60,//空闲时间TimeUnit.SECONDS,//空闲时间(单位)new ArrayBlockingQueue<>(2),//队列Executors.defaultThreadFactory(),//线程工厂,让线程池如何创建线程对象new ThreadPoolExecutor.AbortPolicy()//阻塞队列);
//1.创建对象并绑定端口ServerSocket ss = new ServerSocket(10000);
while (true) {//2.等待客户端来连接Socket socket = ss.accept();
//开启一条线程//一个用户就对应服务端的一条线程//new Thread(new MyRunnable(socket)).start();pool.submit(new MyRunnable(socket));}
}
}
public class MyRunnable implements Runnable{
Socket socket;
public MyRunnable(Socket socket){this.socket = socket;}
@Overridepublic void run() {try {//3.读取数据并保存到本地文件中BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());String name = UUID.randomUUID().toString().replace("-", "");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));int len;byte[] bytes = new byte[1024];while ((len = bis.read(bytes)) != -1) {bos.write(bytes, 0, len);}bos.close();//4.回写数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("上传成功");bw.newLine();bw.flush();} catch (IOException e) {e.printStackTrace();} finally {//5.释放资源if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}
相关文章:
Java之UDP,TCP的详细解析
练习四:文件名重复 public class UUIDTest { public static void main(String[] args) { String str UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } public class Client…...
【总结】kubernates crd client-java 关于自定义资源的增删改查
Java model 准备 首先使用 crd.yml 和 kubernetes CRD 自动生成 Java model 类,这是一切的前提,之前在这个地方也卡了很久。如何生成在另外一个文章中已经有所记录。 使用 crd.yml 和 kubernetes CRD 自动生成 Java model 类 CustomObjectsApi 文档学习…...
蓝牙主要知识,一文概览
蓝牙知识相关 文章目录 蓝牙知识相关1.蓝牙版本的发展简史2.低功耗BLE PHY2.1 频段**2.2 BLE调制方案—GFSK**2.3 **蓝牙 LE 传输速度、功率和接收器灵敏度**2.4 **BLE 时分双工 (TDD)**3.BT主从连接过程3.1 主设备工作模式3.1.1 积木编程控制台3.2 从设备工作模式3.2.1 蓝牙遥…...

Linux 守护进程
一 何为守护进程 守护进程( Daemon )也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性 地执行某种任务或等待处理某些事情的发生,主要表现为以下两个特点: 长期运行。守护进程是一…...

自动驾驶技术的基础知识
自动驾驶技术是现代汽车工业中的一项革命性发展,它正在改变着我们对交通和出行的理解。本文将介绍自动驾驶技术的基础知识,包括其概念、历史发展、分类以及关键技术要素。 1. 自动驾驶概念 自动驾驶是一种先进的交通技术,它允许汽车在没有人…...

解决:yarn 无法加载文件 “C:\Users\XXXXX\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本“ 的问题
1、问题描述: 报错的整体代码为: yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本 // 整体的报错代码为 : yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1&…...

【JVM--StringTable字符串常量池】
文章目录 1. String 的基本特性2. 字符串拼接操作3. intern()的使用4. StringTable 的垃圾回收 1. String 的基本特性 String 声明为 final 的,不可被继承String 实现了 Serializable 接口:表示字符串是支持序列化的。String 实现了 Comparable 接口&am…...
Large Language Models Meet Knowledge Graphs to Answer Factoid Questions
本文是LLM系列文章,针对《Large Language Models Meet Knowledge Graphs to Answer Factoid Questions》的翻译。 大型语言模型与知识图谱相遇,回答虚假问题 摘要1 引言2 相关工作3 提出的方法4 实验设计5 结果与讨论6 结论 摘要 最近,有研…...

blender 之视频渲染(以三维重建path为例)
blender 之视频渲染(以三维重建path为例) 1.新建轨迹路径2.设置相机,使其按照path运动3.将相机视角对准物体4.修改帧率5.设置输出路径6.设置输出格式7.渲染 1.新建轨迹路径 新建轨迹 选中新建的BezierCycle,按住S,拖…...
leetcode做题笔记166. 分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。 如果小数部分为循环小数,则将循环的部分括在括号内。 如果存在多个答案,只需返回 任意一个 。 对于所有给定的输入,保证 …...

Android Studio新建项目缓慢解决方案
关于Android Studio2022新建项目时下载依赖慢的解决方案 起因解决方案gradle下载慢解决方案kotlin依赖下载慢解决方案 结尾 起因 新建Android Studio项目时,常会因为网络问题导致部分依赖下载缓慢,其中gradle和kotlin最拖慢进度。 解决方案 gradle下载…...

AmdU (5-azidomethyl-2‘-deoxyuridine)的反应原理|59090-48-1
产品简介:叠氮甲基dU(AmdU)是一种核苷类化合物,它含有叠氮基团,这种结构特点使其在细胞学和生物学领域得到了广泛应用。与胸腺嘧啶核苷相似的结构,使得叠氮甲基dU(AmdU)能够被细胞聚…...
使用nvm安装多个node版本
github下载地址: Releases coreybutler/nvm-windows (github.com) 安装了 nvm(Node Version Manager)后,可以使用以下步骤安装第二个 Node.js 版本: 打开终端或命令提示符。 使用以下命令列出可用的 Node.js 版本: …...

基于springboot实现自习室预订系统的设计与实现项目【项目源码+论文说明】分享
基于springboot实现自习室预订系统的设计与实现演示 摘要 在网络高速发展的时代,众多的软件被开发出来,给学生带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,学院只能以学生为导向,所以自习…...
淘宝详情API接口
一、引言 随着互联网的快速发展和电子商务的广泛应用,淘宝作为中国最大的C2C电商平台,其提供的API接口在各种应用中发挥着越来越重要的作用。本文将详细介绍淘宝详情API接口的背景、定义、类型,以及在各种应用场景中的作用和优势,…...

充气膜结构的应用领域
由于充气膜结构具有丰富多彩的造型,优异的建筑特性、结构特性和适宜的经济性等其他传统建筑无法比拟的优势,因此备受人们青睐,被应用于工业、民用、军事等许多领域中,具有广阔的应用前景。 充气膜结构的主要应用领域包括ÿ…...

自动拟人对话机器人在客户服务方面起了什么作用?
在当今数字时代,企业不断寻求创新的方法来提升客户服务体验。随着科技的不断进步和消费者期望的提升,传统的客户服务方式逐渐无法满足现代消费者的需求。因此,许多企业正在积极探索利用新兴技术来改进客户服务,自动拟人对话机器人…...

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis
LIS系统源码技术特点:采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。 技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C…...

tcpdump(一)基础理论知识
一 抓包分析技术初探 说明: 本篇章跟tcp/ip的知识没有关系,只是讲解tcpdump工具背景补充: 抓包是做报文分析的第一步敬畏心: 隔行如隔山,不要想当然 ① 背景 ② 抓包技术名词 1、捋顺这些技术的来龙去脉甚至八卦;2、这样我们在后续课程…...

一种重要的天然氨基酸L-Homopropargylglycine(HPG)|CAS:942518-19-6
产品简介:L-Homopropargylglycine是一种重要的天然氨基酸,具有多种生物活性和医学应用价值。它广泛应用于生物学、药学、化学等多个领域。在生物学中,HPG被用作蛋白质合成的标记物,可以通过其特殊的化学反应与蛋白质中的半胱氨酸残…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...