Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举

一、网络编程TCP

Java对基于TCP协议得网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。

1、TCP协议发数据
1.1 构造方法

方法

说明

Socket(InetAddress address,int port)

创建流套接字并将其连接到指定IP指定端口号

Socket(String host,int port)

创建流套接字并将其连接到指定主机上的指定端口号

1.2 相关方法

方法

说明

InputStream getInputStream()

返回此套接字的输入流

OutputStream getOutputStream()

返回此套接字的输出流

1.3 代码实现
public class Client {? ?public static void main(String[] args) throws IOException {? ? ? ?//创建客户端的Socket对象(Socket)? ? ? ?//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号? ? ? ?Socket s = new Socket("127.0.0.1",10000);
?? ? ? ?//获取输出流,写数据? ? ? ?//OutputStream getOutputStream() 返回此套接字的输出流? ? ? ?OutputStream os = s.getOutputStream();? ? ? ?os.write("hello,tcp,我来了".getBytes());
?? ? ? ?//释放资源? ? ? ?os.close();? ? ? ?s.close();?  }
}
2、TCP协议收数据

Java为客户端提供了Socket类,为服务端提供了ServeSocket类

2.1 构造方法

方法

说明

ServerSocket(int port)

创建绑定到指定端口的服务器套接字

2.2 相关方法

方法

说明

Socket accept()

监听要连接到此的套接字并接受它

2.3 代码实现
public class Server {? ?public static void main(String[] args) throws IOException {? ? ? ?//创建服务器端的Socket对象(ServerSocket)? ? ? ?//ServerSocket(int port) 创建绑定到指定端口的服务器套接字? ? ? ?ServerSocket ss = new ServerSocket(10000);
?? ? ? ?//Socket accept() 侦听要连接到此套接字并接受它? ? ? ?Socket s = ss.accept();
?? ? ? ?//获取输入流,读数据,并把数据显示在控制台? ? ? ?InputStream is = s.getInputStream();? ? ? ?byte[] bys = new byte[1024];? ? ? ?int len = is.read(bys);? ? ? ?String data = new String(bys,0,len);? ? ? ?System.out.println("数据是:" + data);
?? ? ? ?//释放资源? ? ? ?s.close();? ? ? ?ss.close();?  }
}

注意事项:

  • accept方法是阻塞的,作用就是等待客户端连接

  • 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接

  • 针对客户端来讲,是往外写的,所以是输出流 针对服务器来讲,是往里读的,所以是输入流

  • read方法也是阻塞的

  • 客户端在关流的时候,还多了一个往服务器写结束标记的动作

  • 最后一步断开连接,通过四次挥手协议保证连接终止

3、三次握手和四次挥手
3.1 三次握手

3.2 四次挥手

4、TCP文件上传案例
  • 案例需求

    客户端:数据来自于本地文件,接收服务器反馈

    服务器:接收到的数据写入本地文件,给出反馈

  • 分析思路

    • 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出结束后使用shutdownOutput()方法告知服务端传输结束

    • 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,传输结束后,使用输出流给客户端反馈信息

    • 客户端接收服务端的回馈信息

  • 相关方法

    方法

    说明

    void shutdownInput()

    将此套接字的输入流放置在“流的末尾”

    void shutdownOutput()

    禁止用此套接字的输出流

  • 服务端优化思路

    • 服务端可以多次处理

      • 循环包裹while(true)

      • 使用UUID区分了重名文件,防止二次上传文件重名造成覆盖

    • 将服务器改进为多线程版本,满足多个客户端同时通信

    • 改为线程池

  • 代码实现

public class Client {? ?public static void main(String[] args) throws IOException {? ? ? ?//1、创建Socket对象指定ip和端口? ? ? ?Socket socket = new Socket("192.168.11.251",8888);? ? ? ?//2、获取传输数据的流对象(网络流)? ? ? ?InputStream is = socket.getInputStream();? ? ? ?OutputStream os = socket.getOutputStream();? ? ? ?//3、将字节流转换为字符串(读写的内容有中文)? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(is));? ? ? ?PrintStream ps = new PrintStream(os);? ? ? ?File file = new File("D:\好哥哥.jpg");? ? ? ?//4、写出文件名? ? ? ?ps.println(file.getName());? ? ? ?//5、读取服务端消息? ? ? ?String state = br.readLine();? ? ? ?if("ok".equals(state)){? ? ? ? ? ?//6、上传文件(字节)? ? ? ? ? ?//创建本地字节输入流关联要上传的文件? ? ? ? ? ?FileInputStream fis = new FileInputStream(file);? ? ? ? ? ?byte[] bys = new byte[1024];? ? ? ? ? ?int len;? ? ? ? ? ?while((len=fis.read(bys))!=-1){? ? ? ? ? ? ? ?os.write(bys,0,len);? ? ? ? ?  }? ? ? ? ? ?//重点:写出结束标记给服务端? ? ? ? ? ?socket.shutdownOutput();? ? ? ? ? ?fis.close();? ? ? ? ? ?//7、读取上传结果? ? ? ? ? ?String result = br.readLine();? ? ? ? ? ?System.out.println(result);? ? ? ? ? ?//8、关流? ? ? ? ? ?socket.close();? ? ?  }?  }
} ![qwqw](https://i-blog.csdnimg.cn/direct/28c3f979e67f4abab03bc2ab850b2837.png#pic_center)public class Server {? ?public static void main(String[] args) throws IOException {? ? ? ?//1、创建ServerSocket对象指定端口? ? ? ?ServerSocket server = new ServerSocket(8888);? ? ? ?System.out.println("服务端开启,等待客户端连接");
?? ? ? ?ThreadPoolExecutor pool = new ThreadPoolExecutor(? ? ? ? ? ? ? ?5,? ? ? ? ? ? ? ?10,? ? ? ? ? ? ? ?60,? ? ? ? ? ? ? ?TimeUnit.SECONDS,? ? ? ? ? ? ? ?new ArrayBlockingQueue<>(20),? ? ? ? ? ? ? ?Executors.defaultThreadFactory(),? ? ? ? ? ? ? ?new ThreadPoolExecutor.AbortPolicy()? ? ?  );
?? ? ? ?while (true) {? ? ? ? ? ?//2、调用accept方法响应客户端的请求? ? ? ? ? ?Socket socket = server.accept();
?? ? ? ? ? ?//new Thread(new SubmitFileTask(socket)).start();? ? ? ? ? ?pool.submit(new FileSubmitTask(socket));? ? ?  }?  }
}public class FileSubmitTask implements Runnable{? ?//为了拿到另一个类的数据,将其作为参数传进本类,在本类创建带参构造并接收该参数赋值给本类的成员变量,就拿到了? ?private Socket socket;? ?public FileSubmitTask(Socket socket) {? ? ? ?this.socket=socket;?  }
?? ?@Override? ?public void run() {? ? ? ?try {? ? ? ? ? ?//3、获取传输的输入流对象(网络流)? ? ? ? ? ?InputStream is = socket.getInputStream();? ? ? ? ? ?OutputStream os = socket.getOutputStream();? ? ? ? ? ?//4、将字节流转换为字符串(读写的内容有中文)? ? ? ? ? ?BufferedReader br = new BufferedReader(new InputStreamReader(is));? ? ? ? ? ?PrintStream ps = new PrintStream(os);? ? ? ? ? ?//5、读取客户端发送的文件名? ? ? ? ? ?String fileName = br.readLine();? ? ? ? ? ?//关联服务端的存储路径? ? ? ? ? ?File update = new File("D:\itheima\Resource", UUID.randomUUID()+fileName);? ? ? ? ? ?//6、写给客户端消息? ? ? ? ? ?ps.println("ok");? ? ? ? ? ?//7、创建本地字节输出流,关联存储路径? ? ? ? ? ?FileOutputStream fos = new FileOutputStream(update);? ? ? ? ? ?//8、IO读写? ? ? ? ? ?byte[] bys = new byte[1024];? ? ? ? ? ?int len;? ? ? ? ? ?while((len = is.read(bys))!=-1){? ? ? ? ? ? ? ?fos.write(bys,0,len);? ? ? ? ?  }? ? ? ? ? ?fos.close();? ? ? ? ? ?//9、写出上传成功? ? ? ? ? ?ps.println("上传成功!");? ? ? ? ? ?//10、关流? ? ? ? ? ?socket.close();? ? ?  } catch (IOException e) {? ? ? ? ? ?e.printStackTrace();? ? ?  }?  }
}

二、日志

程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。日志和输出语句的比较

输出语句

日志技术

输出位置

只能是控制台

可以将日志信息写入到文件或者数据库中

取消日志

需要修改代码,灵活性比较差

不需要修改代码,灵活性比较好

多线程

性能较差

性能较好

1、日志体系结构

  • 日志规范:一些接口,提供给日志的实现框架设计的标准

  • 日志框架:牛人或者第三方公司已经做好的日志记录实现代码,后来直接可以拿去使用

  • 因为对Commons Logging 的接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback

2、Logback快速入门
  • 官网: Logback Home

  • 三个技术模块

    模块名

    介绍

    locback-core

    该模块为其他两个模块提供基础代码,必须有。

    logback-classic

    完整实现了slf4j API的模块。

    logback-access

    logback-access 模块与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志功能

2.1 操纵步骤
第一步:引入jar包

jar包本质来说就是压缩包,内部存储的都是别人已经写好的代码。在需要导包的项目模块下,和src平级的位置,创建lib目录,将需要的jar包都放进去,然后勾选Add as Library。导jar包只是目前的做法,后面会学maven来管理jar包,不用手动导入

第二步:导入配置文件

将日志的配置信息文件(logback.xml)复制到模块的src

  • 日志级别和配置文件详解

    通过通过logback.xml 中的标签可以设置输出位置和日志信息的详细格式。通常可以设置2个日志输出位置:一个是控制台、一个是系统文件中

第三步:获取日志对象使用
public class LogTest {? ?public static void main(String[] args) {? ? ? ?//获取记录日志对象? ? ? ?Logger logger = LoggerFactory.getLogger("LogTest.class");? ? ? ?//记录日志? ? ? ?logger.info("记录了一条日志");?  }
}

三、枚举

枚举是Java中的一种特殊类型,其作用是为了做信息的标志和信息的分类。枚举可以理解为一种多例设计模式,保证类的对象,在内存中只有固定的几个

1、定义格式

修饰符 enum 枚举类型{
//第一行都是罗列枚举类实例的名称
枚举项1,枚举项2,枚举项3;
}

enum Season{? ?SPRING,SUMMER,AUTUMN,WINTER;
}
2、枚举的特点
  • 所有枚举类都是 Enum 的子类

  • 我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项

  • 每一个枚举项其实就是该枚举的一个对象

  • 枚举也是类, 可以定义成员变量

  • 枚举类的第一行上必须是枚举项,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略

  • 枚举类可以有构造器,但必须是 private 的,它默认的也是 private 的。枚举项的用法比较特殊:枚举(“”);

  • 枚举类也可以有抽象方法,但是枚举项必须重写该方法

3、示例代码
public enum Season {
?? ?SPRING("春"){
?? ? ? ?//如果枚举类中有抽象方法? ? ? ?//那么在枚举项中必须要全部重写? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }
??  },
?? ?SUMMER("夏"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  },
?? ?AUTUMN("秋"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  },
?? ?WINTER("冬"){? ? ? ?@Override? ? ? ?public void show() {? ? ? ? ? ?System.out.println(this.name);? ? ?  }?  };
?? ?public String name;
?? ?//空参构造? ?//private Season(){}?? ?//有参构造? ?private Season(String name){? ? ? ?this.name = name;?  }?? ?//抽象方法? ?public abstract void show();
}
?
public class EnumDemo {? ?public static void main(String[] args) {? ? ? ?//我们可以通过"枚举类名.枚举项名称"去访问指定的枚举项? ? ? ?System.out.println(Season.SPRING);? ? ? ?System.out.println(Season.SUMMER);? ? ? ?System.out.println(Season.AUTUMN);? ? ? ?System.out.println(Season.WINTER);
?? ? ? ?//每一个枚举项其实就是该枚举的一个对象? ? ? ?Season spring = Season.SPRING;?  }
}
4、做信息标志方式(2种)
4.1 常量

虽然可以实现可读性,但是入参不受约束,代码相对不够严谨

4.2 枚举

代码可读性好,入参约束严谨,代码优雅,是最好的信息分类技术!建议使用!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16470.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#02项目——Checked用法

知识点 本项目用到的知识点包括&#xff1a; checked。主要用来处理溢出错误 Try.Prarse。将数字的字符串表示形式转换为其等效的 32 位有符号整数。 返回值指示转换是否成功 public static bool TryParse (string? s, out int result);Try…Catch。用于捕捉异常&#xff0c…

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

Windows 系统 GDAL库 配置到 Qt 上

在地理信息开发中广泛使用的开源库&#xff0c;GDAL(Geospatial Data Abstraction Library&#xff09;)库提供了读取和处理各种地理空间数据格式的能力。 准备阶段 下载 GDAL 库&#xff1a;前往 GDAL 的官方网站&#xff08;https://www.gisinternals.com/&#xff09;下载…

自己动手实现一个简单的Linux AI Agent

大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址&#xff1a; https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…

豆包MarsCode “一键Apply”功能测评:编程效率革新利器

本文 前言功能亮点1. 告别重复操作2. 精准问题解决3. 助力新项目开发4.代码快速切换5.注释快速生成&#xff0c;一键Apply直接粘贴 使用体验总结 本文正在参加豆包MarsCode上新Apply体验活动 前言 在当今快节奏的编程开发领域&#xff0c;效率无疑是开发者们追求的核心目标之一…

SpringBoot中的Javaconfig

为什么要使用Javaconfig&#xff1f; 如果要声明的bean对象&#xff0c;来自于第三方jar包&#xff08;不是自定义的&#xff09;&#xff0c;无法使用Component 及衍生注解来声明bean&#xff0c;因为第三方的jar一般不可写&#xff0c;需要使用注解Configuration和Bean注解来…

ThinkPHP8视图赋值与渲染

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 在控制器操作中&#xff0c;使用view函数可以传入视图…

笔记4——列表list

列表list list&#xff1a;一种有序的集合&#xff1b;可以随时添加和删除列表元素&#xff1b;可以包含不同数据类型 使用 【】 定义列表&#xff1b;元素之间用 , 分开 my_list [1,love,0.123,[1,2,3]] print(my_list)len() &#xff1a;获取元素个数&#xff1b;空列表…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴&#xff0c;数据管理系统无非就两个问题&#xff1a;数据怎么存、数据怎么算    现在的信息爆炸时代&#xff0c;一台服务器数据存不下&#xff0c;可以找10台服务器存储&#xff0c;10台存储不下&#xff0c;可以再找100台服务器存储。但是这1…

分布式 IO 模块:港口控制主柜的智能 “助手”

在繁忙的港口&#xff0c;每一个集装箱的装卸、每一艘货轮的停靠与离港&#xff0c;都离不开高效精准的控制系统。港口控制主柜作为整个港口作业的核心枢纽之一&#xff0c;其稳定运行至关重要。而明达技术自主研发推出的MR30分布式 IO 模块可作为从站&#xff0c;与 PLC&#…

Golang GORM系列:GORM 高级查询教程

有效的数据检索是任何程序功能的基础。健壮的Go对象关系映射包&#xff08;称为GORM&#xff09;除了标准的CRUD操作之外&#xff0c;还提供了复杂的查询功能。这是学习如何使用GORM进行高级查询的综合资源。我们将涵盖WHERE条件、连接、关联、预加载相关数据&#xff0c;甚至涉…

常见的数据仓库有哪些?

数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…

搜维尔科技在动作捕捉与动画制作、汽车制造与安全测试、机器人与自动化领域的一些案例

动作捕捉与动画制作领域 1.逼真的手部和面部动画制作&#xff1a;动画师施先生利用搜维尔科技代理的Xsens套装、Manus VR手套和Faceware的面部动作捕捉系统&#xff0c;捕捉短片中人物的手部和面部动作&#xff0c;再将数据重新定位到角色骨架上并调整&#xff0c;最终在虚幻引…

HTTP3原理解析和实战应用

http协议原理解析 HTTP1.1改动 keeplive 在http1.0版本中http连接会在每次请求都会发起连接, 并且每次连接在保证安全性都需要建立三次握手, 每次请求后就立即断开连接, 下次请求就还需要重新建立连接.这样就提升了请求的复杂度. keeplive就使得每次建立连接后可以多次请求…

【分布式理论9】分布式协同:分布式系统进程互斥与互斥算法

文章目录 一、互斥问题及分布式系统的特性二、分布式互斥算法1. 集中互斥算法调用流程优缺点 2. 基于许可的互斥算法&#xff08;Lamport 算法&#xff09;调用流程优缺点 3. 令牌环互斥算法调用流程优缺点 三、三种算法对比 在分布式系统中&#xff0c;多个应用服务可能会同时…

VMware Windows_10_x64 安装 VM Tools 后无法将本机文件复制到虚拟机

有一种情况&#xff0c;安装VM Tools死活安装不上去。这时不要急不要慌&#xff0c;重启本机就好了&#xff08;本人情况就是如此&#xff09;。 windows键 R 输入 service.msc 打开服务管理器 找到Virtual Disk服务&#xff0c;选择属性设置为自动&#xff0c;应用后启用服…

uniapp 编译生成鸿蒙正式app步骤

1&#xff0c;在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件&#xff08;构建-生成私钥和证书请求文件&#xff09; 2&#xff0c;华为开发者平台 根据上面生成的csr文件新增cer和p7b文件&#xff0c;分发布和测试 3&#xff0c;在最新版本DevEco-Studio工具 文…

AI+智能中台企业架构设计_重新定义制造(46页PPT)

本文档主要探讨了“中台”的概念及其在制造领域的应用&#xff0c;通过百度中台技术案例&#xff0c;展示了如何利用ABCIOT&#xff08;人工智能、大数据、云计算和物联网&#xff09;重新定义制造业。中台被定义为企业内部核心管理平台&#xff0c;包括微服务业务平台、组织创…

基于Java的分布式系统架构设计与实现

Java在大数据处理中的应用&#xff1a;基于Java的分布式系统架构设计与实现 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加。为了高效处理海量数据&#xff0c;分布式系统成为了必不可少的架构之一。而Java&#xff0c;凭借其平台独立性、丰富的生态系统以…

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 11

第11章_数据处理之增删改 首先得先有一个表&#xff1a; #0. 储备工作 USE atguigudb;CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_date DATE, salary DOUBLE(10,2) );DESC emp1;SELECT * FROM emp1; 1.增加数据 #方式1&#xff1a;一条一条的添加…