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

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的详细解析

练习四&#xff1a;文件名重复 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 类&#xff0c;这是一切的前提&#xff0c;之前在这个地方也卡了很久。如何生成在另外一个文章中已经有所记录。 使用 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 守护进程

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

自动驾驶技术的基础知识

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

解决:yarn 无法加载文件 “C:\Users\XXXXX\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本“ 的问题

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

【JVM--StringTable字符串常量池】

文章目录 1. String 的基本特性2. 字符串拼接操作3. intern()的使用4. StringTable 的垃圾回收 1. String 的基本特性 String 声明为 final 的&#xff0c;不可被继承String 实现了 Serializable 接口&#xff1a;表示字符串是支持序列化的。String 实现了 Comparable 接口&am…...

Large Language Models Meet Knowledge Graphs to Answer Factoid Questions

本文是LLM系列文章&#xff0c;针对《Large Language Models Meet Knowledge Graphs to Answer Factoid Questions》的翻译。 大型语言模型与知识图谱相遇&#xff0c;回答虚假问题 摘要1 引言2 相关工作3 提出的方法4 实验设计5 结果与讨论6 结论 摘要 最近&#xff0c;有研…...

blender 之视频渲染(以三维重建path为例)

blender 之视频渲染&#xff08;以三维重建path为例&#xff09; 1.新建轨迹路径2.设置相机&#xff0c;使其按照path运动3.将相机视角对准物体4.修改帧率5.设置输出路径6.设置输出格式7.渲染 1.新建轨迹路径 新建轨迹 选中新建的BezierCycle&#xff0c;按住S&#xff0c;拖…...

leetcode做题笔记166. 分数到小数

给定两个整数&#xff0c;分别表示分数的分子 numerator 和分母 denominator&#xff0c;以 字符串形式返回小数 。 如果小数部分为循环小数&#xff0c;则将循环的部分括在括号内。 如果存在多个答案&#xff0c;只需返回 任意一个 。 对于所有给定的输入&#xff0c;保证 …...

Android Studio新建项目缓慢解决方案

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

AmdU (5-azidomethyl-2‘-deoxyuridine)的反应原理|59090-48-1

产品简介&#xff1a;叠氮甲基dU&#xff08;AmdU&#xff09;是一种核苷类化合物&#xff0c;它含有叠氮基团&#xff0c;这种结构特点使其在细胞学和生物学领域得到了广泛应用。与胸腺嘧啶核苷相似的结构&#xff0c;使得叠氮甲基dU&#xff08;AmdU&#xff09;能够被细胞聚…...

使用nvm安装多个node版本

github下载地址: Releases coreybutler/nvm-windows (github.com) 安装了 nvm&#xff08;Node Version Manager&#xff09;后&#xff0c;可以使用以下步骤安装第二个 Node.js 版本&#xff1a; 打开终端或命令提示符。 使用以下命令列出可用的 Node.js 版本&#xff1a; …...

基于springboot实现自习室预订系统的设计与实现项目【项目源码+论文说明】分享

基于springboot实现自习室预订系统的设计与实现演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给学生带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;学院只能以学生为导向&#xff0c;所以自习…...

淘宝详情API接口

一、引言 随着互联网的快速发展和电子商务的广泛应用&#xff0c;淘宝作为中国最大的C2C电商平台&#xff0c;其提供的API接口在各种应用中发挥着越来越重要的作用。本文将详细介绍淘宝详情API接口的背景、定义、类型&#xff0c;以及在各种应用场景中的作用和优势&#xff0c…...

充气膜结构的应用领域

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

自动拟人对话机器人在客户服务方面起了什么作用?

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

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

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

tcpdump(一)基础理论知识

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

一种重要的天然氨基酸L-Homopropargylglycine(HPG)|CAS:942518-19-6

产品简介&#xff1a;L-Homopropargylglycine是一种重要的天然氨基酸&#xff0c;具有多种生物活性和医学应用价值。它广泛应用于生物学、药学、化学等多个领域。在生物学中&#xff0c;HPG被用作蛋白质合成的标记物&#xff0c;可以通过其特殊的化学反应与蛋白质中的半胱氨酸残…...

5步打造企业级数字人创作平台:从本地化部署到场景落地全指南

5步打造企业级数字人创作平台&#xff1a;从本地化部署到场景落地全指南 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 一、价值定位&#xff1a;数字人技术的企业级应用价值 核心价值&#xff1a;Duix.Avatar通过全本…...

像素时装锻造坊应用场景:AR滤镜开发中像素化虚拟服装贴图生成流程

像素时装锻造坊应用场景&#xff1a;AR滤镜开发中像素化虚拟服装贴图生成流程 1. 项目背景与核心价值 像素时装锻造坊&#xff08;Pixel Fashion Atelier&#xff09;是一款基于Stable Diffusion与Anything-v5的图像生成工作站&#xff0c;专为AR滤镜开发中的虚拟服装贴图生成…...

Element React深度解析:企业级React组件库的架构设计与实战应用

Element React深度解析&#xff1a;企业级React组件库的架构设计与实战应用 【免费下载链接】element-react Element UI 项目地址: https://gitcode.com/gh_mirrors/el/element-react Element React是一款基于React框架构建的企业级UI组件库&#xff0c;它为开发者提供了…...

塔罗牌选框架:准确率超机器学习模型

技术选型困境与创新突破在软件测试领域&#xff0c;技术栈选择一直是核心挑战。传统方法依赖历史数据和机器学习模型&#xff0c;但常陷入“预测陷阱”——过度依赖过往经验导致创新盲区。例如&#xff0c;自动化测试框架的错误选型每年造成巨额损失&#xff1a;38.7%源于技术生…...

神经高利贷:预支未来技能导致认知崩溃

在软件测试领域&#xff0c;从业者常面临一个隐形威胁&#xff1a;过度追求新技能而忽视认知极限&#xff0c;最终引发崩溃。这种现象被称为“神经高利贷”&#xff0c;即通过预支未来学习能力来应对当前挑战&#xff0c;结果导致认知资源枯竭、错误率飙升&#xff0c;甚至职业…...

双阶段目标检测是什么?有什么用?

一、引言在计算机视觉技术飞速发展的当下&#xff0c;目标检测作为核心分支&#xff0c;早已从实验室走向现实生活的方方面面&#xff0c;成为人工智能感知世界的关键入口。所谓目标检测&#xff0c;就是让计算机通过对图像、视频的分析&#xff0c;同步完成物体定位与物体分类…...

【故障】解决ssh连接linux卡着不动的问题

1、原因使用xshell连接一台linux机器&#xff0c;发现连接不上&#xff0c;一直都开在连接这个界面&#xff0c;最后超时才停止。2、排查&#xff08;1&#xff09;首先&#xff0c;检查下防火墙或者selinuxsystem status firewalld #检查服务是否处于非Running的状态getenforc…...

5分钟解决经典游戏兼容性问题:DDrawCompat完整使用指南

5分钟解决经典游戏兼容性问题&#xff1a;DDrawCompat完整使用指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDraw…...

3分钟完成Axure RP中文界面汉化:终极完整指南

3分钟完成Axure RP中文界面汉化&#xff1a;终极完整指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包&#xff0c;不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axu…...

SakuraLLM:二次元翻译的终极解决方案,完全离线的日中翻译大模型

SakuraLLM&#xff1a;二次元翻译的终极解决方案&#xff0c;完全离线的日中翻译大模型 【免费下载链接】Sakura-13B-Galgame 适配轻小说/Galgame的日中翻译大模型 项目地址: https://gitcode.com/gh_mirrors/sa/Sakura-13B-Galgame 如果你热爱日本轻小说、Galgame等二次…...