自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 应用层的重点协议

HTTP工作过程中涉及到的密钥有3组:第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在注册证书时获得),客户端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥)。服务器使用这个私钥对证书签名进行加密。客户端通过这个公钥解密获取到证书的签名,从而校验证书内容是否被篡改过第二组(非对称加密):用于协商生成对称加密的密钥。服务器生成这组私钥-公钥对,然后通过证书把公钥传递给客户端。

2024-07-21 21:41:51 763

原创 数据链路层重点协议

目的主机接收到广播的ARP请求发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。双方在发送SYN时会在TCP头部写入自己能支持的MSS值,然后双方得知对方的MSS值之后,选择较小的作为最终MSS。最理想的情况下,MSS的值正好是在IP不会分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层产生的限制。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网、无线LAN网。

2024-07-16 14:18:56 626

原创 网络层重点协议—IP协议

在复杂的网络环境中确定一个合适的路径。

2024-07-13 23:12:40 389

原创 传输层重点协议

负责数据能够从发送端传输接收端。

2024-07-13 14:54:21 868

原创 关于网络编程

指网络上的主机,通过不同的进程以编程的方式实现网络通信(网络数据传输)

2024-05-30 19:57:50 967

原创 超级初始网络

本机环回主要用于本机到本机的网络通信(系统内部为了性能,不会走网络的方式传输),对于开发网络通信的程序(即网络编程)而言,常见的开发方式都是本机到本机的网络通信。IP地址和端口号可以定位到网络中唯一的一个进程,计算机之间的传输媒介是光信号和电信号,通过”频率“和”强弱“来表示1和0这样的信息。一般的家用路由器,常见的有5个网口,要想让这几个电脑在同一个局域网上网,就要把他们连接到Lan口,Wan口是用来连上级的路由器的。网游打破了局域网的限制,成就了广域网对战-“传奇”(网游系列的开山之作)“PK”

2024-05-25 14:16:31 836

原创 Linux实用操作

环境变量是操作系统(Windows、Linux、Mac)在运行的时候,记录的一些关键性信息,用以辅助系统运行。o在一些IP地址限制中,表示所有IP的意思,如放行规则设置为0.0.0.0,表示允许任意IP访问。为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为系统中的一个:进程。num1:刷新间隔(不填就查看一次结束),num2:查看次数(不填无限次数)IPv4版本的地址格式是:a.b.c.d,其中abcd表示0~255的数字。计算机程序之间的通讯,通过IP只能锁定计算机,但是无法锁定具体的程序。

2024-05-23 19:32:37 944

原创 Linux用户和权限

普通用户的权限,一般在其HOME目录内是不受限的;一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限。但是并不是所有的用户都有权利使用sudo,需要先为普通用户配置sudo认证才有权利使用sudo。-r:删除用户的HOME目录;不使用-r,删除用户时,HOME目录保留。Linux系统中,拥有最大权限的账户名为:root(超级管理员)指定-g需要组已经存在,如已存在同名组,必须使用-g 选项。不指定,HOME目录默认在:/home/用户名。文件夹:可更改工作目录到此文件夹(cd)

2024-05-20 18:41:36 701

原创 JSP - Java Servlet基础

当服务器创建Servlet对象后,该对象会调用init() 初始化自己,以后每当服务器再接收到一 个Servlet请求时,就会产生一个新线程,并在这个线程中让Servlet对象调用service(),检查 HTTP请求类型(GET、POST等),并在service() 中根据用户的请求方式,对应地再调用doGet() 或doPost()因 此,不同线程的service()方法中的局部变量互不干扰,一个线程改变了自己的service()方法中局部变量的值不会影响其他线程的service()方法中的局部变量。

2024-05-18 14:51:01 224

原创 Linux基础命令

cat b.txt | grep apple | wc -l 或 grep "apple" b.txt | wc -l。表示以易于阅读的形式,列出文件大小,如K、M、G(4096->4.0k)(必须要搭配 -l 使用)演示:su -root输入密码123456临时切换到root用户->强制删除->exit退出。/usr/local/hello.txt (开头/表示根目录,后面/表示层级关系。查找小于10KB的文件:find / -size -10k。ls [-a -l -h] [路径]

2024-05-16 21:43:13 903

原创 龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构:接下来是我仅代表我个人提出的一些疑问与解答:其实在这里两个动物类就像标签一样标签组件是什么?用于短文本字符串或图片显示固定提示信息。下面给出这个初始界面的代码与效果图:2、多线程实现俩小动物比赛在上面的代码中,我们把兔子乌龟都定为标签类,但是俩东西参加比赛,是要同时参与比赛过程的,这里要利用多线程实现,也就是兔子、乌龟这俩标签要在比赛过程中(进程)移动,他俩的行为都属于这个进程(比赛)中的俩线程。我们知道线程的创建方式有很多

2024-05-11 20:27:47 728

原创 GUI-图形化的用户界面

所谓GUI,即图形化的用户界面/接口(Graphical User Interface),实现了采用图形方式显示的计算机操作用户界面。比如下面的QQ登录界面:为了不被落下,Java依旧稳定发挥,它也提供了一套可以轻松构建GUI的工具,将GUI界面封装为类,其中若干类放在了java.awt包和javax.swing包内:java.awt(抽象窗口工具包)依赖于本地操作系统的GUI,缺乏平台独立性,属重量级控件包中主要包括界面组件、布局管理器、事件处理模型及图形和图像工具...java.swing。

2024-05-09 19:33:04 711

原创 JSP与JavaBean

如果这样的Bean存在,Tomcat服务器就分配这样的Bean给用户;通过Tomcat服务器创建Bean的过程可以看出,首次创建一个新的Bean需要用相应类的字节码文件创建对象,当某些JSP页面再需要同样的Bean时,Tomcat服务器直接将pageContent中已经有的Bean分配给JSP页面,提高了JSP使用Bean的效率。当JSP页面使用getProperty标记获取属性xxx的值时,必须保证bean有相应的getXxx方法,即对方法的名字的命名有特殊的要求。用于设置和访问Bean的属性。

2024-05-04 23:24:55 814

原创 JSP内置对象

内置对象就是不加声明就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量,使用这些对象可以使用户更容易使用收集客户端发送的请求信息,并响应客户端的请求以及存储客户信息,从而简化了JSP程序开发的复杂性。JSP一共有9种基本内置对象:request、response、session、application、out、page、config、pageContext、exception。

2024-05-03 15:59:45 911

原创 Tag文件与Tag标记

Tag文件为了给JSP页面返回一个对象,就必须将返回的对象的名字以及该对象的引用存储到Tomcat服务器提供的内置对象jspContext中。Tag文件与JSP文件很类似,可以被JSP页面动态加载调用,实现代码的复用,但用户不能通过该Tag文件所在Web服务目录直接访问Tag文件。Tag标记的名字和Tag文件的名字一致,也就是说,当我们编写了一个Tag文件并保存到特定的目录中,也就给出了一个Tag标记,该标记格式为。可以将Tag文件中的返回对象给调用该Tag文件的JSP页面。

2024-05-01 12:44:00 784

原创 JSP基础知识

HTML标记、CSS样式、变量和方法的声明、表达式、Java脚本、JSP标 记(指令标记、动作标价),其他脚本元素(JavaScript等)HTML:Java://内容 或者 /*内容*/JSP:如果想把声明的变量和方法用到多个页面中,可以把它们写成一个独立的文件,使用时用指令包含进来由变量、常量、运算符等组成,表达式必须能够求值,表达式的值由服务器计算,并输送到客户端显示在脚本中也可以声明变量,但二者是不一样的。

2024-05-01 00:47:52 1614 1

原创 区区多线程...面试题

Servlet本身是工作在多线程环境下,若在Servlet中创建了某个成员变量,此时若有多个 请求到达服务器,服务器就会多线程进行操作,是可能出现线程不安全的情况的。在创建线程的同时需要指定线程完成的任务,可以直接重写Thread的run()方法,也可以使 用Runnable来描述这个任务。堆区就是多个线程之间共享的,只要把数据放到堆内存中,就可以让多个线程都能访问到。synchronized加在非静态方法上相当于针对当前对象加锁。

2024-04-28 21:41:50 365 2

原创 多线程(六)

可以看出,上述代码需要一个辅助类Result,还需要一系列的加锁和wait、notify操作,代码复杂,容易出错;比如我们知道的StringBuffer中的方法都是加了锁的,这里只是在单线程下使用,但append()方法每次调用都要加锁解锁,这没必要,浪费了大量的资源开销,这下就要给锁消除了...使用细粒度锁,是期望释放锁时其它线程可以使用,这样能够并发执行的逻辑更多,更有利于充分利用多核cpu资源,但是也有可能。Semaphore的PV操作的加减计数器都是原子的,可以在多线程环境下直接使用。

2024-04-28 20:40:14 1485 1

原创 多线程—CAS(五)

可以引入版本号version,约定每次修改余额version++,此时在使用CAS判定时,就不是直接 判定数值了,而是判定版本号,看版本号是否变化:若版本号不变,则表示没有其他线程穿插执行。全称Compare-And-Swap,即“比较并交换”,相当于一个原子的操作,同时完成“读取内存,比较是否相等,修改内存”这三个步骤,本质上需要cpu指令的支持。当多个线程同时对某个资源进行CAS操作,只能有一个线程操作成功,但是并不会阻塞其他线程,其他线程只会收到操作失败的信号。CAS则是通过重试的方式避免穿插执行。

2024-04-26 18:14:08 687 1

原创 多线程—锁策略(四)

按照之前对锁的设定,第二次加锁的时候,就会阻塞等待,直到第一次的锁被释放,才能获取到第二个锁,但是释放第一个锁也是由该线程完成的,结果这个锁没有解锁反而又加锁,这也就无法进行解锁操作,这时候就会死锁。若调用increase2( ),则increase()先加了一层锁,在increase2里又调用increase(),这就又加了一层锁,但是上个锁还没释放。一旦该线程锁之后,接下来哪个线程能拿到锁?若线程t1加锁时,发现锁已被占用,而这个占用者正是自己,这时是仍可以获取到锁的,并且让计数器自增;

2024-04-24 20:57:52 827

原创 多线程基础—案例(三)

这个时候就可以把这些请求 都放到一个阻塞队列中,然后再由消费者线程慢慢的来处理每个支付请求。这种饿汉模式即便是在多线程的情况下也是线程安全的,因为它在类加载的时候就已经创建了实例,后续只能通过getinstance获取对象,而即便多个线程同时调用getinstance也只是都在进行读取操作,这显然是非常安全的。上面我们已经说了,线程安全问题只会出现在首次创建对象的时候,实例一旦创建好了,后面在多线程环境调用getinstance就不再修改instance了,而只是读取返回,这是线程安全的。

2024-04-24 12:57:37 1503

原创 多线程—线程安全(二)

比如说ATM,一个人取款发现里面没钱了,那他得等人来把钱放进去才能有钱,这时候为了避免让他近水楼台先得月一直在那里跟后面的人排队竞争,让他wait(不让他参与排队直接让他在旁边等人放钱进去),让后面的人进行存款业务,等ATM里面有钱了再叫他去取款,这样存款的人跟取款的人都不会饿死。按照之前对锁的设定,第二次加锁的时候,就会阻塞等待,直到第一次的锁被释放,才能获取到第二个锁,但是释放第一个锁也是由该线程完成的,结果这个锁没有解锁反而又加锁,这也就无法进行解锁操作,这时候就会死锁。但可惜的是,寄存器贵。

2024-04-20 16:42:10 539

原创 Java 快速排序

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。

2024-04-16 23:36:22 517

原创 多线程基础(一)

执行 isInterrupt() 方法将标志位改为true,线程被唤醒,sleep()抛出InterruptedException异常,但sleep()方法又同时自动清除刚才的标志位,又改回false,循环又继续执行,线程就又无法结束。而start()方法会启动一个新的线程,并在新的线程中异步执行run()方法中的指令,而当前线程会继续执行后续的代码,这就实现了并发执行的效果;所以实际在Java的线程中,直接调用run()方法 和 调用start()方法的主要区别在于线程的执行方式。

2024-04-06 16:37:50 589 1

原创 JDBC — Java的数据库编程

JDBC,即Java Database Connectivity,数据库连接。是一种用于执行SQL语句的Java API,它是Java种中的数据库连接规范。这个API由java.sql.*、javax.sql.*包中的一些类和接口组成,为java开发人员提供了一个标准的API,可以为多种关系数据库提供统一访问。

2024-04-04 13:10:37 864 1

原创 MYSQL数据库基础

mysql是一个“客户端-服务器”结构的软件客户端:主动发起请求服务器:被动接受请求的一方二者通过网络进行通信客户端给服务器发起的数据--请求(Request)服务器给客户端发起的数据--响应(Response)服务器时刻等待客户端发起请求,一个服务器往往也要给多个客户端服务真正的服务器,往往是要7*24小时运行(全年无休,1秒不歇)也有是只给一个服务器工作的(相对来说的服务器与客户端)分布式系统:一台机器,能够处理的数据是有限的,往往就需要引入多台机器,相互配合,完成更复杂的工作。

2024-03-23 13:17:36 832

原创 文件操作 — IO

方法返回值类型方法签名说明intread()返回0~255之间的数据(一个字节byte),返回-1表示读到文件末尾int最多读取b.length字节的数据到b中,返回实际读到的数量intvoidclose()关闭字节流while (len!=-1) {方法返回值类型方法签名说明void写入要给字节的数据void将b这个字符数组中的数据全部写入os中intvoidclose关闭字节流void。

2024-03-08 22:16:42 638 1

原创 优先级队列(堆) PriorityQueue

队列是一种先进先出的数据结构,但是在有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的先出队列,在这种情况下,使用先进先出的队列显然不合适。关于向下调整的时间复杂度分析,最坏的情况即,从根一路比较到叶子,则比较的次数为二叉树的高度,时间复杂度则为 O(若2*(i+1)

2024-01-31 22:25:25 615

原创 详详解继承

final修饰变量array1,而array保存的是一个数组的地址,不可修改array存储的值(不可让 array1指向新的对象)如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法(参数列表)调用,否则编译失败。注意:若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法。注意:在子类构造方法中,super(...)调用父类构造时,必须是子类构造方法中第一条语句。

2023-10-10 21:33:23 48 2

原创 详解类和对象

class 类名{成员变量(属性);成员方法(行为);注意:类名采用大驼峰定义;成员名前统一 采用public;此处写的方法不带static关键字一般一个文件当中只定义一个类 main方法所在的类一般要使用public修饰注意:Eclipse默认会在public修饰的类中找main方法public修饰的类必须要和文件名相同不要轻易去修改public在文件的最上方加上一个package语句指定该代码在哪个包中(package chap01)

2023-10-07 10:26:26 72 1

原创 详解单链表的相关操作

但是下面左图的表示方法很不方便,而且我们在使用单链表时,只关心数据元素之间逻辑关系,也就是数据元素的顺序,而不关心每个数据元素存储在哪一个位置,所以我们可以将单链表画成下面右图的样子。函数传参的时候,参数是需要压栈的。设置一个工作指针p,当指针p指向某结点时执行相应的处理,然后将指针p修改为指向其后继结点,直到p指向NULL为止。当工作指针指针指向某结点时,输出该结点的数据域,再指向下一个结点,一直循环下去,直到p指向空。p指向的结点中还存储了下一个结点的地址,删了这条链子不就没了,后面的结点怎么找到。

2023-09-21 21:24:00 123 2

原创 数据在内存中的存储

int main()//1111111 11111111 11111111 11101100 i的补码//0000000 00000000 00000000 00001010 j的原码//1111111 11111111 11111111 11110110 计算机内存中相加计算结果(补码)//-10return 0;for (i = 0;i < 1000;i++)//255。

2023-03-22 18:43:43 40

原创 详解操作符

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个数的类型,否则操作就无法进行。表达式求值的顺序一部分是由操作符的优先级和结合性决定。同样,有些表达式的操作数在求值的过程中可能需要转化为其他类型。就是用逗号隔开的多个表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。接受一个或者多个操作符,第一个操作数是函数名,剩余的操作数就是传递给函数的参数。C的整型算数运算总是以缺省整型类型的精度来进行的。算术数移:左边用该值的符号位填充,右边丢弃。%的两个操作数必须为整数。

2023-03-12 19:22:55 57

原创 初识结构体

int x;int y;}p1;//声明类型的同时定义变量p1//定义结构体变量p2//初始化:定义变量的同时赋初值struct Stuint age;struct Stu s = { "张三",20 };//初始化int data;//结构体嵌套初始化//结构体嵌套初始化。

2023-02-28 19:26:55 53

原创 for循环与递归例题

新创建一个变量tmp使数组左右两边元素发生交换,做两端的两个元素发生交换后,左右下标分别增一或减一,再次发生交换,以此发生循环,直至左边下标大于或等于右边下标时停止循环交换。编写一个函数 reverse_string(char * string)(递归实现)函数reverse_string( )无返回类型,参数为数组arr[]。不想用strlen,可以自己创建Strlen求字符串长度。如何利用自定义函数求字符串长度呢?第一种类型题为已定数组中所有元素。a.一个函数只能返回一个结果。利用递归如何实现呢?

2023-02-10 18:10:06 151 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除