![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JavaWeb
silencer1024
这个作者很懒,什么都没留下…
展开
-
详解TCP协议(四),保活机制(心跳包)
九、粘包问题严格粘包问题不是TCP自身机制,而是面向字节流传输所具备的共性问题粘包:粘的应用层数据报,导致处理数据的时候,容易读取半个应用层数据报HTTP协议基于TCP的应用层协议,自己会处理好粘包问题:1.对于GET请求,分隔符就是空行2.对于POST请求,Content-length指定包的长度十、保活机制1.进程崩溃,这种情况下,TCP连接会正常四次挥手(只要进程退出,都会自动关闭相关的文件)2.主机关机(按流程关机),关机时会强制先杀进程,杀进程过程中就进行四次挥手3.主机断电/网原创 2020-08-16 23:42:32 · 1279 阅读 · 0 评论 -
JDBC编程的基本流程(代码模板)
以插入用户操作为例:DBUtil类及其相关方法参考上一篇文章public void add(User user) { // JDBC 编程的基本流程 // 1. 先获取和数据库的连接(DataSource) Connection connection = DBUtil.getconnection(); // 2. 拼装 SQL 语句(PrepareStatement) String sql = "insert into user value(null,?,?,?)原创 2020-08-14 23:55:30 · 681 阅读 · 0 评论 -
一般项目,创建一个DBUtil类进行封装,管理连接(代码模板)
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;// DBUtil 本质上是一个管理了单例的 DataSource 的类public class DBU原创 2020-08-14 23:51:08 · 170 阅读 · 0 评论 -
详解TCP协议(三)
五、流量控制窗口大小不能无限大,传输速率太快,接收方可能处理不过来,根据接收方的处理能力来反向制衡发送方的发送速率(窗口大小)六、拥塞控制和流量控制共同决定发送方的窗口大小的考虑网络传输路径上的拥堵程度(动态变化的)七、延时应答为了提高效率,在流量控制的基础上,尽量返回一个合理的但是又比较大的窗口,延时应答其实就是让ack的发送时间晚一会(不影响可靠性的前提下),延时时间中就会给应用程序提供更多的消费数据的机会,当延时时间到了,再发ack,得到的窗口大小更大(缓冲区剩余空间更大)八、捎带应答原创 2020-08-13 23:47:17 · 108 阅读 · 0 评论 -
详解TCP协议(二) 详解滑动窗口下丢包情况
上一篇讲完三次握手和四次握手,接下来是滑动窗口 四、滑动窗口首先滑动窗口是在保证可靠性的前提下,让我们进一步提高传输效率。如果没有滑动窗口的机制:传输N份文件,就需要等待N次应答时间,总的传输时间=N份传输时间+N份应答传输时间滑动窗口的本质就是批量传输总的传输时间:N分数据传输时间叠加成一份时间,N份应答传输时间,重叠成一份时间窗口大小:不等待ACK的情况下,批量发送最大数据的量如果在在滑动窗口的机制下传送数据发生丢包:1.ACK丢包如上图,数据包已经到达,ACK丢了如果丢失ACK原创 2020-08-12 23:33:33 · 981 阅读 · 0 评论 -
详解TCP协议(一) 全面解析三次握手和四次握手
一、确认应答(ACK)机制TCP面向字节流,TCP会将每个字节的数据都进行编号,即序列号,每一个ACK都带有对应的确认序列号。二、超时重传机制确认应答是比较理想的情况,数据在传输过程中,可能会丢包丢包:1.发送请求丢失2.回复的ack丢失不管哪种情况都会触发重新传输报文。原理:当发送了一条数据之后,TCP内部就会自动启动一个定时器,达到一定时间也没有收到ack,定时器就会触发重传消息机制。三、连接管理机制1.建立连接 三次握手过程ACK:确认应答 SYN:同步报文段(尝试与对原创 2020-08-11 23:55:51 · 442 阅读 · 0 评论 -
定时器的实现
import java.util.concurrent.PriorityBlockingQueue;/** 定时器*/public class Test1 {//优先队列中的元素必须是可比较的//比较规则的指定主要是两种方式//1.让Task实现Comparable接口//2.让优先级队列构造的时候,传入一个比较器对象(Comparator)static class Task implements Comparable{//Runnable 中有一原创 2020-07-28 23:49:57 · 76 阅读 · 0 评论 -
用DBUtils来封装DataSource且 连接和断开方法模板
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class DBUtils {private static volatile DataSo原创 2020-07-27 15:38:27 · 260 阅读 · 0 评论 -
maven配置对应版本的sql和servlet
https://mvnrepository.com上面链接是maven的中央仓库,直接下载需要的,复制粘贴即可原创 2020-07-23 09:35:01 · 179 阅读 · 0 评论 -
HttpServer2response
import java.io.BufferedWriter;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.util.HashMap;import java.util.Map;// 表示一个 HTTP 响应, 负责构造// 进行序列化操作public class HttpResponse {private String version =原创 2020-07-18 10:11:59 · 141 阅读 · 0 评论 -
HttpServer2request
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;// 表示一个 HTTP 请求, 并负责解析.public class HttpRequest {private String method;// /index.htm原创 2020-07-18 10:10:56 · 238 阅读 · 0 评论 -
HttpServer2
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class HttpServer2 {private ServerSocket serverSocket = null;public HttpServer2(in原创 2020-07-18 10:10:06 · 192 阅读 · 0 评论 -
Http服务器最简单版本
import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class HttpServer1 {// HTTP 底层要基于 TCP 来实现. 需要原创 2020-07-17 11:12:20 · 65 阅读 · 0 评论 -
TCP下的服务器实现
import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TcpEchoServer {// 1. 初始化服务器// 2. 进入主循环// 1) 先去从内核中获取到一个 TCP 的连接// 2) 处理这个 TCP 的连接// a) 读取请求并解析// b) 根据请求计算响应// c) 把响应写回给客户端private ServerSocket ser原创 2020-07-16 19:42:04 · 69 阅读 · 0 评论 -
UDP协议的服务器
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class Test_DatagramSocket {// 对于一个服务器程序来说, 核心流程也是要分成两步.// 1. 进行初始化操作 (实例化 Socket 对象)// 2. 进入主循环, 接受并处理请求. (主循环就是一个 “死循环”)原创 2020-07-15 12:02:49 · 179 阅读 · 0 评论 -
服务器
public class Test_DatagramSocket {// 对于一个服务器程序来说, 核心流程也是要分成两步.// 1. 进行初始化操作 (实例化 Socket 对象)// 2. 进入主循环, 接受并处理请求. (主循环就是一个 “死循环”)// a) 读取数据并解析// b) 根据请求计算响应// c) 把响应结果写回到客户端.private DatagramSocket socket = null;//int port服务器必须绑定一个端口(服务器绑定了端口之后原创 2020-07-14 21:00:49 · 125 阅读 · 0 评论 -
字节流文件的复制
public class TestIO {public static void main(String[] args) throws IOException {copyFile(“d:/testFile/kenan.jpg”, “d:/testFile/kenan2.jpg”);}private static void copyFile2(String srcPath, String destPath) {FileInputStream fileInputStream = null;FileOu原创 2020-07-02 13:28:53 · 321 阅读 · 0 评论 -
递归打印当前目录以及内部所有文件
public class TestFile {public static void main(String[] args) throws IOException {File file = new File(“d:/testFile”);listAllFiles(file);}private static void listAllFiles(File x){if (x.isDirectory()){File[] files = x.listFiles();for (File xxx: file原创 2020-06-29 13:41:39 · 145 阅读 · 0 评论 -
详解索引底层数据结构 (与B树、B+树、哈希表区别)
.1.索引是什么’索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现2.索引的效果(1).加快查找的效率(2).拖慢数据插入,删除和修改的效率...原创 2020-06-20 15:55:21 · 601 阅读 · 1 评论 -
实现线程池
import java.util.ArrayList;import java.util.List;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;public class Test1 {//使用Worker这个类来描述当前的工作线程是什么样的static class Worker extends Thread{ private int id = 0;原创 2020-06-19 15:50:58 · 75 阅读 · 0 评论 -
阻塞队列的实现
public class Test1 {static class BlockingQueue{//普通队列实现方式两种:1.基于链表2.基于数组private int[] array = new int[1000];//head和tail构成一个前闭后开区间 当两者重合的时候,可能表示队列空或者满private int head = 0;private int tail = 0;private int size = 0; //队列的基本操作:1.入队列2.出队列3.取队首元素原创 2020-06-15 15:37:02 · 247 阅读 · 0 评论 -
线程不安全的原因
**1.**线程是抢占式执行**2.**自增操作不是原子的**3.**多个线程尝试修改一个变量3.1 如果是一个线程修改一个变量 线程安全3.2如果是多个线程尝试读取同一变量 线程安全3.3如果是多个线程修改不同变量 线程安全**4.**内存可见性导致线程安全问题**5.**指令重排序(Java的编译器在编译代码时,会针对指令进行优化,调整指令的先后顺序,提高程序的运行效率)...原创 2020-06-14 10:52:39 · 168 阅读 · 0 评论 -
synchronized 锁
public class Test4 {public static void main(String[] args) {//如果只定义一个locker 那么就是两个线程抢谁抢到了等执行完之后才能继续执行另一个线程//定义一个locker1 locker2 分别给thread1 thread2加锁两个线程各跑各的 互不影响 不互斥//如果locker1 locker2 .getClass的话 那下面两个线程就分别针对locker1 locker2的类对象//进行竞争 此处的locker1 locke原创 2020-06-10 15:43:44 · 138 阅读 · 0 评论 -
创建线程的五种方法
1.通过显示继承Thread类实现2.通过匿名内部类继承Thread类实现3.显式创建一个类,实现Runnable接口,然后把这个Runnable的实例关联到Thread类上4.通过匿名内部类实现Runnable接口实现5.通过lambad表达式实现Runnable接口...原创 2020-06-05 10:25:44 · 160 阅读 · 0 评论