- 博客(93)
- 收藏
- 关注
原创 Windows下通过WireShark抓包WebSocket协议-WSS
我们在正常使用WireShark抓包WebSocket协议的时候,如果只过滤wesocket,很可能只看到WebSocket的建立链接的过程,其他发送数据的过程可能看不到;由于我们这里是本地测试,用的是localhost,所有Wireshark的网卡选择【Adapter for loopback traffic】客户端发送WebSocket数据:可以在在下面的协议详情里面看到,客户端的数据现在是Unmasked的明文状态了。WebSocket协议是通过Http协议升级来的,可以支持长连接。
2024-08-09 11:55:24
3942
1
原创 MySQL innodb单表上限一般多少
在文章的开头已经介绍了页的结构,索引也也不例外,都会有File Header(38 byte)、Page Header (56 Byte)、Infimum + Supermum(26 byte)、File Trailer(8byte),再加上页目录,大概1k 左右,我们就当做它就是1K,那整个页的大小是16K,剩下15k用于存数据,在索引页中主要记录的是主键与页号,主键我们假设是Bigint(8 byte),而页号也是固定的(4Byte),那么索引页中的一条数据也就是12byte;
2024-08-01 16:17:12
1081
原创 漏洞评分CVSS Score
弱点(vulnerabilities)是网络安全中的一个重要因素,在多种安全产品(如漏洞扫描、入侵检测、防病毒、补丁管理等)中涉及到对弱点及其可 能造成的影响的评价。通用弱点评价体系(CVSS)可以对弱点进行评分,进而帮助我们判断修复不同弱点的优先等级。
2024-07-30 14:39:14
561
原创 JVM GC总结
对于对象年龄应该为多少才移动到老年代比较合适,本例中一次minor gc要间隔二三十秒,大多数对象一般在几秒内就会变为垃圾,完全可以将默认的15岁改小一点,比如改为5,那么意味着对象要经过5次minor gc才会进入老年代,整个时间也有一两分钟了,如果对象这么长时间都没被回收,完全可以认为这些对象是会存活的比较长的对象,可以移动到老年代,而不是继续一直占用survivor区空间。当秒杀活动开始,大量请求打入系统,但自适应算法计算的GC触发间隔较长,导致GC触发不及时,引起了内存分配阻塞,导致停顿。
2024-07-27 12:03:21
939
原创 Netty ByteBuf内存泄露检查
Netty的ResourceLeakDetector是一种用于检测资源泄露的工具。当对象在没有明确释放的情况下被垃圾收集器回收时,可能会发生资源泄露。每当创建新的ByteBuf或者其他需要释放的资源时,Netty会将其注册到ResourceLeakDetector中。如果检测到有注册的资源在垃圾收集后没有被释放,ResourceLeakDetector会打印警告或错误信息。Netty启动时会根据系统属性或环境变量设定的阈值创建ResourceLeakDetector实例。
2024-07-25 19:56:10
357
原创 -XX:MaxDirectMemorySize和-Dio.netty.maxDirectMemory区别
默认值是JVM能从操作系统申请的最大内存,如果内存本身没限制,则值为Long.MAX_VALUE个字节。使用JDK时:调用java.nio.DirectByteBuffer#DirectByteBuffer(int)构造器方法进行直接内存申请的时候,才会受-XX:MaxDirectMemorySize参数限制。直接调用Unsafe类,-XX:MaxDirectMemorySize 参数的大小限制对这种是无效的。
2024-07-23 17:16:34
1656
原创 一次Java直接内存溢出定位经历
环境:JDK8现象:测试压测过程中,有一个转发服务容器的内存占比98%,过一段时间后,容器重启;问题可复现定位:容器有重启行为,可以使用先查看系统错误日志发现:是宿主机 cgroup将容器进程kill掉。
2024-07-23 15:36:06
976
原创 Windows下通过Wireshark抓包https协议
环境:对于加密的https,实际通信是基于非对称加密算法后,在对称算法加密通道内的报文。在不知道生成的私钥情况下,是无法获取报文明文内容的;Wireshark本文重点介绍第二种方法。
2024-07-23 07:31:30
1321
原创 运行flink-runtime_2.11_1.11.2报错:java.base does not “opens java.lang“ to unnamed module @1810399e
常见的unamed问题通常有两种:opens 和exports。这里稍微总结下JDK高版本中的unnamed问题。针对不同的问题,添加相应的VM启动参数即可。注意这里错误信息中的关键字【opens 】对应的解决方案还是添加相应的VM启动参数。
2024-07-10 10:13:57
525
原创 Linux Swap
第一种就是文件页,所谓文件页就是其物理内存页中的数据来自于磁盘中的文件,当我们进行文件读取的时候,内核会根据局部性原理将读取的磁盘数据缓存在 page cache 中,page cache 里存放的就是文件页。匿名页的回收机制就是我们经常看到的 Swap 机制。当内存资源紧张需要对不经常使用的那些匿名页进行回收时,因为匿名页的背后没有一个磁盘中的文件做依托,所以匿名页不能像文件页那样直接回收,无论匿名页是不是脏页,都需要先将匿名页中的数据先保存在磁盘空间中,然后在对匿名页进行回收。
2024-06-29 10:58:49
541
原创 Linux内核虚拟内存空间
由于进程之间的用户态虚拟内存空间是相互隔离相互独立的,虽然在进程a,进程b,进程c 访问的都是虚拟地址 x 但是看到的内容却是不一样的(背后可能映射到不同的物理内存中)。但是当进程 a,进程 b,进程 c 进入到内核态之后情况就不一样了,由于内核虚拟内存空间是各个进程共享的,所以它们在内核空间中看到的内容全部是一样的,比如进程 a,进程 b,进程 c 在内核态都去访问虚拟地址 y。这时它们看到的内容就是一样的了。内核态虚拟内存空间是所有进程共享的,不同进程进入内核态之后看到的虚拟内存空间全部是一样的。
2024-06-27 11:48:14
283
原创 Linux中进程和线程区别
当一个内核线程被调度时,它会发现自己的虚拟地址空间为 Null,虽然它不会访问用户态的内存,但是它会访问内核内存,聪明的内核会将调度之前的上一个用户态进程的虚拟内存空间 mm_struct 直接赋值给内核线程,因为内核线程不会访问用户空间的内存,它仅仅只会访问内核空间的内存,所以直接复用上一个用户态进程的虚拟地址空间就可以避免为内核线程分配 mm_struct 和相关页表的开销,以及避免内核线程之间调度时地址空间的切换开销。子进程共享了父进程的虚拟内存空间,这样子进程就变成了我们熟悉的线程,
2024-06-27 11:03:30
626
原创 Java NIO Buffer概念
由于 DirectBuffer 和 MappedBuffer 背后的存储内存是在堆外内存中分配,不受 JVM 管理,所以不能用一个 Java 基本类型的数组表示,而是直接记录这段堆外内存的起始地址。DirectBuffer 背后的存储内存是在堆外内存中分配,MappedBuffer 是通过内存文件映射将文件中的内容直接映射到堆外内存中,其本质也是一个 DirectBuffer。HeapBuffer 顾名思义它背后的存储内存是在 JVM 堆中分配,在堆中分配一个数组用来存放 Buffer 中的数据。
2024-06-24 09:40:52
424
原创 Netty中的ChannelHandler和ChannelHandlerContext
Netty 引入 ChannelHandlerContext 来封装 ChannelHandler 的原因,在代码设计上还是遵循单一职责的原则, ChannelHandler 是用户接触最频繁的一个 netty 组件,netty 希望用户能够把全部注意力放在最核心的 IO 处理上,用户只需要关心自己对哪些异步事件感兴趣并考虑相应的处理逻辑即可,而并不需要关心异步事件在 pipeline 中如何传递,如何选择具有执行条件的 ChannelHandler 去执行或者跳过。
2024-06-21 07:31:19
262
原创 Netty中的各个关键时间点(二)
前置说明本文主要记录Netty中的一些主要的关键时间点,是理解Netty 和 事件驱动的关键。也是阅读Netty源码的指导。代码来源:Netty 4.1.77本文涉及到的角色:角色:主线程,主Reactor线程(bossGroup中的EventLoop), 从Reactor线程(workGroup中的EventLoop),结合Reactor编码模型理解。
2024-06-20 16:47:21
272
原创 Netty中的各个关键时间点(一)
这些关键时间点,是理解Netty 和 事件驱动的关键角色:主线程,主Reactor线程(bossGroup中的EventLoop), 从Reactor线程(workGroup中的EventLoop)
2024-06-20 10:54:22
732
原创 Netty中Reactor线程的运行逻辑
当Reactor正在Selector上阻塞时,如果此时用户线程向Reactor提交了异步任务,Reactor线程会通过execute方法被唤醒。是在当Socket写入缓冲区以满无法继续写入发送数据时由用户自己注册。的运行框架,那么我们现在来看下这个运行框架具体是怎么运转的~~这里需要注意的是netty只会自动注册。执行Netty中的异步任务。正是这三个部分组成了。OP_WRITE事件。
2024-06-18 15:58:51
386
原创 Netty中的Reactor模型实现
其中Linux kernel 在5.1版本引入的异步IO库io_uring正在netty中孵化。有着不同的实现,我们只需要切换不同的实现类就可以完成对Netty。比如Linux 2.6版本以上用的是。根据操作系统以及版本的不同选择对应的。Netty版本:4.1.17。,2.6版本以下用的是。IO多路复用技术实现。
2024-06-17 15:17:23
437
原创 Kafka中的RPC:Server端代码流程简单概述
然后处理completedReceives:org.apache.kafka.common.requests.RequestHeader#parse反序列化数据,获取RequestHeader,然后将数据封装为kafka.network.RequestChannel.Request#Request。下一轮org.apache.kafka.common.network.Selector#poll的时候就可以处理OP_WRITE,把待发送的数据Send,通过SocketChannel进行发送,
2024-06-13 15:17:25
503
原创 Windows下,mvn install Java项目,报错:编码 GBK 的不可映射字符 (0xA8)
我们可以在IDEA中,对有中文的文件,依次调整编码方式,先从UTF-8 convert 为GBK,再convert 为UTF-8,此时在用本地mvn命令编译代码后,日志中的中文显示正常。因为使用mvn命令的使用,我们使用的是自己安装的maven,mvn执行的时候使用的是Windows的平台默认编码GBK。但是我已经在IDEA中设置了项目中的文件编码方式为UTF-8了呀。且没有上面的编码 GBK 的不可映射字符 (0xA8)的问题。现象:使用IDEA新导入了一个Java语言的maven项目。
2024-06-11 10:01:44
519
原创 浏览器中的disable cache对文件下载服务的影响
在下次调用的时候只需要在head中添加If-Modified-Since,询问服务器该文件是否被修改了即可,如果文件没有被修改,则服务器会返回一个304 Not Modified,客户端得到该状态之后就会使用本地的缓存文件。但是过一段时间就正常了,客户端缓存就生效了,请求头里面就有If-Modified-Since了,响应状态也是:304 Not Modified了。当请求一个xml文件的时候,开启浏览器缓存的时候,第二次得到的响应状态是:200 OK (from disk cache);
2024-06-07 11:54:21
778
原创 Windows下使用netty的SelfSignedCertificate进行SSL加密通信
当我们在自己的开发环境中进行测试的时候,有一个非常简单的方法来创建证书和私钥文件,netty提供了SelfSignedCertificate类。在使用netty的时候,经常需要对通信进行SSL加密,这就需要相关的证书和秘钥;只需要这样一行代码,Netty就会帮我们自动生成自签名的证书和私钥。文件名前缀为:keyutil_example.com_解决:添加boucycastle的依赖。
2024-06-05 11:32:20
668
原创 基于Netty实现安全认证的WebSocket(wss)服务端
4.1生成mystore.jks后,不导入证书,直接启动服务端使用;选择证书存储为【受信任的根证书颁发机构】,完成即可。】中基本一样,只是把服务端地址的协议头修改为wss。或者导入证书后不手动信任,客户端进行连接时候,会报错。启动服务端,然后启动客户端,连接和接发数据都正常。双机上面生成的证书文件mystore.cer,4.2 客户端连接服务端的地中,协议头还是ws。可以看到证书此时不受信任,点击【安装证书】JavaScript客户端代码,也是和 【再次双击原证书,可以看到证书已经受信任了。
2024-05-27 18:44:11
2648
原创 基于Netty实现WebSocket客户端
握手事件是在自定义的Handler中实现的,这里为了方便使用CountDownLatch,使用了匿名内部类SimpleChannelInboundHandler的方式。这里我们不手动进行握手,由Netty通过WebSocketClientProtocolHandler进行握手,但是我们要知道何时握手完成了。测试的时候,我们可以看到,当客户端发送ping的时候,服务端会自动回pong,这个是有Netty实现的服务端自带的心跳机制。】,测试用的WebSocket服务端也是用Netty实现的,参考【
2024-05-25 16:40:52
3121
2
原创 java实现websocket的五种方式(mark下)
java实现websocket的五种方式java 实现 websocket的五种方式_java_萧曵 丶-GitCode 开源社区
2024-05-24 17:06:39
308
原创 基于Netty实现WebSocket服务端
中,我们知道WebSocket是基于Http协议的升级,而Netty提供了Http和WebSocket Frame的编解码器和Handler,我们可以基于Netty快速实现WebSocket服务端。我们可以直接利用Netty提供了Http和WebSocket Frame的编解码器和Handler,快速启动一个WebSocket服务端。本文基于Netty实现WebSocket服务端,实现和客户端的交互通信,客户端基于JavaScript实现。一、基于Netty快速实现WebSocket服务端。
2024-05-24 09:51:27
2178
原创 WebSocket简介
Client端需要向服务器端发送一个Http请求,请求头携带Connection: Upgrade以及Upgrade: websocket两字段,用来告知服务器这是一个WebSocket握手请求。WebSocket API是HTML5中的一大特色,能够使得建立连接的双方在任意时刻相互推送消息,这意味着不同于HTTP,服务器服务器也可以主动向客户端推送消息了。还是在F12的websocket的Messages页中可以看到Client发送和接收的消息。具体的客户端和服务端的代码,可以参考【
2024-05-24 07:44:19
864
原创 JavaScript: Uncaught SyntaxError: Invalid or unexpected token
把上面的html代码直接保持为html文件,双机打开后,发现并没有连接到服务端的WebSocket上;打开F12,可以看到在Console标签下有错误信息:Uncaught SyntaxError: Invalid or unexpected token (at front.html:14:12)今天测试WebSocket功能,Client端:使用Html+JavaScript,通过浏览器解析后,当做客户端;刷新页面,看到可以正常连接到服务端了。好久没有碰前端的代码了。修改为英文等号,即可;
2024-05-22 16:33:15
344
原创 运行flink-runtime_2.11_1.11.2报错:java.base does not export sun.net.util to unnamed module @0x1a407d53
【代码】运行flink-runtime_2.11_1.11.2报错:java.base does not export sun.net.util to unnamed module @0x1a407d53。
2024-05-10 10:39:29
648
原创 项目中多个版本依赖冲突问题:Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonMerg
在2.6.7这个数据上,右键选择【Open Library Settings】,然后点击-号,进行删除。只要根据报错信息,把2.13.5版本依赖加进去就可以了。我们会看到提示,哪个模块使用了这个依赖,点击ok后,再次运行,会有对应代码会报错,我这里就是,再次运行代码,就ok了。
2024-04-29 15:47:05
689
原创 idea添加scala库,src\main\scala‘ is duplicated in module ‘XXX‘.
具体来说,src\main\scala目录被多次标记为Scala源代码目录。导航到 "File" > "Project Structure" 或者使用快捷键 "Ctrl+Alt+Shift+S" 打开项目结构对话框。我这边缺失有两个src\main\scala,这是因为我创建scala目录的时候,手动mark as source了。BTW:上面的解决方法,是我搜索时,百度的大模型自动给出的答案,有时这个答案还是可以的。点击 "Apply" 应用更改,然后点击 "OK" 关闭对话框。
2024-04-29 15:13:37
1946
原创 Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(三)
一个客户端的读事件,分配一个线程处理,但是线程还没处理完,下个读事件就来了,就又分配一个线程处理。前面的文章中,服务端都是在一个单线程main中,处理所有接收到的IO事件,为了提高效率,会自然的想到,为OP_READ和OP_WRITE事件分配多线程处理。解决方法:不可以并发读同一个client, 在处理一个Client的 OP_READ的时候先取消 OP_READ的注册,读完了后,在注册一个 OP_READ。从服务端日志中,可以看到,每个客户端的读事件,只有一个线程处理。再添加一个客户端2,发送数据。
2024-04-25 11:55:50
600
2
原创 Java 网络编程之TCP(五):分析服务端注册OP_WRITE写数据的各种场景(二)
2.注册OP_WRITE时:是使用key.interestOps(key.interestOps() + SelectionKey.OP_WRITE);在OP_WRITE事件来的时候,要把先把OP_WRITE事件去掉,key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);3.注册OP_WRITE时,要写的数据,直接给到了原来channel对应的attachment里了;1.在注册OP_WRITE时,需要给所有其他客户端注册;
2024-04-24 17:25:31
291
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人