<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Coder_py的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Coder_py</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Coder_py]]></copyright><item><title><![CDATA[Spring Boot集成MyBatis、Redis、JWT、Shiro]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/106532103</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/106532103</guid><author>Coder_py</author><pubDate>Wed, 03 Jun 2020 20:20:35 +0800</pubDate><description><![CDATA[Spring Boot集成MyBatis、Redis、JWT、Shiro
认证流程

自定义过滤器

@Slf4j
public class JwtFilter extends BasicHttpAuthenticationFilter {

    /**
     * 执行登录认证
     *
     * @param request
     * @param response
     * @param mappedValue
     * @return
     */
    @Overri]]></description><category></category></item><item><title><![CDATA[数据结构之二叉树]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/106221864</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/106221864</guid><author>Coder_py</author><pubDate>Tue, 19 May 2020 19:58:53 +0800</pubDate><description><![CDATA[数据结构之二叉树
递归构造二叉树
二叉树节点:


public class TreeNode {

    public int data;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int data) {
        super();
        this.data = data;
    }

    @Override
    public String toString() {
   ]]></description><category></category></item><item><title><![CDATA[快速上手spring-boot+spring-security+jwt]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/106101386</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/106101386</guid><author>Coder_py</author><pubDate>Wed, 13 May 2020 16:39:36 +0800</pubDate><description><![CDATA[快速上手spring-boot+spring-security+jwt
数据库表设计
三张表:


用户表 user


角色表 role


用户角色表 user_roles


图示:

实体类
用户类

@Entity
public class User implements UserDetails {

    @Id
    @GeneratedValue
    private Long id;

    private String username;

    private String ]]></description><category></category></item><item><title><![CDATA[数据结构之—栈]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/106041708</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/106041708</guid><author>Coder_py</author><pubDate>Sun, 10 May 2020 20:39:45 +0800</pubDate><description><![CDATA[数据结构之—栈
顺序栈
内部采用数组实现
结构图；

定义结构体:
typedef struct StackInfo
{
    int topOfStack; /*记录栈顶位置*/
    ElementType stack[STACK_SIZE]; /*栈数组，也可以使用动态数组实现*/
}StackInfo_st;


函数声明
int stack_push(StackInfo_st *s,ElementType value);
int stack_pop(StackInfo_st *s,Elemen]]></description><category></category></item><item><title><![CDATA[双链表]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/106003044</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/106003044</guid><author>Coder_py</author><pubDate>Fri, 08 May 2020 18:01:38 +0800</pubDate><description><![CDATA[双链表
整体结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZFeXoXC-1588932073880)(https://upload-images.jianshu.io/upload_images/5653258-79c65c0bc4fbe466.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
初始化

void init(DLlist* pList)
{
    pList-&gt;head = pL]]></description><category></category></item><item><title><![CDATA[Netty + websocket聊天室]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105952494</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105952494</guid><author>Coder_py</author><pubDate>Wed, 06 May 2020 15:52:43 +0800</pubDate><description><![CDATA[Netty + websocket聊天室
程序处理逻辑

启用websocket
从标准的HTTP或者HTTPS协议切换到WebSocket时，将会使用一种称为升级握手的机制。因此，使用WebSocket的应用程序将始终以HTTP/S作为开始，然后再执行升级。这个升级动作发生的确切时刻特定于应用程序；它可能会发生在启动时，也可能会发生在请求了某个特定的URL之后
约定：


如果被请求的 URL ...]]></description><category></category></item><item><title><![CDATA[Netty多人与群组聊天]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105895806</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105895806</guid><author>Coder_py</author><pubDate>Sat, 02 May 2020 21:39:52 +0800</pubDate><description><![CDATA[Netty多人与群组聊天
消息设计
图示:

public abstract class Packet {
    /**
     * 协议版本
     */
    @JSONField(deserialize = false, serialize = false)
    private Byte version = 1;


    @JSONField(serialize = fals...]]></description><category></category></item><item><title><![CDATA[Netty私有协议栈设计]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105879319</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105879319</guid><author>Coder_py</author><pubDate>Fri, 01 May 2020 16:44:04 +0800</pubDate><description><![CDATA[Netty私有协议栈设计
消息定义


消息头


消息主体


图示:

Header：

public class Header {

    private int crcCode = 0xadaf0105; // 唯一的通信标志

    private int length; // 总消息的长度 header + body

    private long sessionID; // ...]]></description><category></category></item><item><title><![CDATA[剖析LengthFieldBasedFrameDecoder]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105863802</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105863802</guid><author>Coder_py</author><pubDate>Thu, 30 Apr 2020 16:01:28 +0800</pubDate><description><![CDATA[剖析LengthFieldBasedFrameDecoder
下面这个测试用例是Netty自带的:
@Test
    public void testDiscardTooLongFrame1() {
        ByteBuf buf = Unpooled.buffer();
        buf.writeInt(32);
        for (int i = 0; i &lt; 3...]]></description><category></category></item><item><title><![CDATA[jenkov.tutorials系列(Java加密与解密的具体使用)]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105783539</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105783539</guid><author>Coder_py</author><pubDate>Mon, 27 Apr 2020 09:32:53 +0800</pubDate><description><![CDATA[jenkov.tutorials系列(Java加密与解密的具体使用)
Java Cipher（javax.crypto.Cipher）类表示一种加密算法。 密码这一术语是密码学领域中加密算法的标准术语。 这就是为什么Java类称为Cipher而不是例如 加密器/解密器或其他东西。
创建Cipher
在使用Java Cipher之前，您只需创建Cipher类的实例。 通过调用带有参数的getInst...]]></description><category></category></item><item><title><![CDATA[jenkov.tutorials系列(Java加密与解密概览)]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105757582</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105757582</guid><author>Coder_py</author><pubDate>Sat, 25 Apr 2020 21:47:06 +0800</pubDate><description><![CDATA[jenkov.tutorials系列(Java加密与解密概览)
Java密码学扩展
Java加密API由正式称为Java加密扩展的Java提供。 Java密码学扩展有时也通过缩写JCE来引用。
Java密码体系结构
Java密码学体系结构（JCA）是Java密码学API内部设计的名称。
JCA是围绕一些中央通用类和接口构建的。 这些接口背后的实际功能由提供程序提供。 因此，您可以使用Cipher类...]]></description><category></category></item><item><title><![CDATA[Netty之Http]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105703247</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105703247</guid><author>Coder_py</author><pubDate>Thu, 23 Apr 2020 11:25:04 +0800</pubDate><description><![CDATA[Netty之Http
Http协议
HTTP是一个属于应用层的面向对象的协议，由于其使用简捷和快速的方式，非常适用于分布式超媒体信息系统。
HTTP协议特点


支持Server/Client模式；


简单——客户向服务器请求服务时，只需要指定服务的URL（统一资源定位符）并且携带对应的请求参数或消息体即可；


灵活——HTTP允许传输任意类型的数据对象，内容类型由HTTP消息头中的Conte...]]></description><category></category></item><item><title><![CDATA[异常控制流]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105645742</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105645742</guid><author>Coder_py</author><pubDate>Mon, 20 Apr 2020 21:51:56 +0800</pubDate><description><![CDATA[异常控制流
系统需要能够对系统状态的改变做出反应，这些系统状态不是被内部程序变量捕获的，而且也不一定和程序的执行相关。如:一个硬件定时器定期产生信号，这个事件必须得到处理。包到达网络适配器，必须放在内存中。程序向磁盘请求数据，然后休眠，直到被通知数据已经就绪。子进程终止时，创造这些子检查点父进程必须得到通知
现代系统通过使控制流突变来对这些情况做出反应，把这些突变称为异常控制流(ECF).异常控制...]]></description><category></category></item><item><title><![CDATA[Netty-TCP拆包/粘包]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105587131</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105587131</guid><author>Coder_py</author><pubDate>Fri, 17 Apr 2020 19:35:12 +0800</pubDate><description><![CDATA[Netty-TCP拆包/粘包
TCP拆包/粘包
TCP 是一个面向字节流的协议，它是性质是流式的，所以它并没有分段。就像水流一样，你没法知道什么时候开始，什么时候结束。所以它会根据当前的套接字缓冲区的情况进行拆包或是粘包
粘包问题图示:

客户端发送两个数据包D1&amp;D2给服务端，因为服务端一次读取的字节数是不确定的，所以可能出现:


正常情况，服务端分两次读取到了两个独立的数据包


服...]]></description><category></category></item><item><title><![CDATA[Netty 的组件和设计]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105544093</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105544093</guid><author>Coder_py</author><pubDate>Wed, 15 Apr 2020 20:48:02 +0800</pubDate><description><![CDATA[Netty 的组件和设计
Channel &amp; EventLoop &amp; ChannelFuture
概览:


Channel — Socket


EventLoop — 控制流、多线程处理、并发


ChannelFuture — 异步通知


Channel 接口

public interface Channel
extends AttributeMap, ChannelOu...]]></description><category></category></item><item><title><![CDATA[Java NIO Selector]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105475794</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105475794</guid><author>Coder_py</author><pubDate>Sun, 12 Apr 2020 20:48:05 +0800</pubDate><description><![CDATA[Java NIO Selector
Java NIO Selector是一个组件，可以检查一个或多个Java NIO Channel实例，并确定哪些通道可供使用,读或写.这样，单个线程可以管理多个通道，从而可以管理多个网络连接。
为什么要使用选择器？
仅使用单个线程来处理多个通道的优点是只需要更少的线程来处理通道。 实际上，只能使用一个线程来处理所有通道。 线程之间的切换对于操作系统来说是昂贵的，...]]></description><category></category></item><item><title><![CDATA[可执行文件的装载与进程]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105405104</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105405104</guid><author>Coder_py</author><pubDate>Thu, 09 Apr 2020 10:40:58 +0800</pubDate><description><![CDATA[可执行文件的装载与进程
进程虚拟地址空间
程序与进程的区别？


程序是一个静态的概念，就是一些预先编译好的指令和数据集合的一个文件


进程则是一个动态的概念，它是程序运行时的一个过程，很多时候吧动态库也叫作运行时


每个程序被运行起来以后，它将拥有自己独立的虚拟地址空间(Virtual Address Space)，这个虚拟地址空间的大小由计算机的硬件平台决定，**具体地说是由CPU的位数决...]]></description><category></category></item><item><title><![CDATA[动态链接]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105396235</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105396235</guid><author>Coder_py</author><pubDate>Wed, 08 Apr 2020 20:29:46 +0800</pubDate><description><![CDATA[动态链接
为什么需要动态链接
静态链接使得不同的程序开发者和部门能够相对独立的开发和测试自己的程序模块，从某种意义上来讲大大促进了程序开发的效率，原先现在程序规模也随之扩大。
但静态链接的缺点也暴露出来：浪费内存、磁盘空间、模块更新困难。
内存与磁盘空间
静态链接在计算机早期还是比较流行的，但是到了后面，其缺点也非常明显。比如浪费内存和磁盘空间，更新模块困难等。
举个例子，每个程序内部除了都保留了...]]></description><category></category></item><item><title><![CDATA[Java-NIO(3)]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105378865</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105378865</guid><author>Coder_py</author><pubDate>Wed, 08 Apr 2020 09:05:10 +0800</pubDate><description><![CDATA[Java-NIO(3)
ByteBuffer
ByteBuffer为Buffer子类，可以在缓冲区中以字节为单位对数据进行存取
此类定义了对字节缓冲区的六种操作类别：


读取和写入单个字节的绝对和相对的get和put方法；


相对批量获取方法，用于将字节的连续序列从此缓冲区传输到数组中；


相对批量放置方法，用于将字节数组或某些其他字节缓冲区中连续的字节序列传输到此缓冲区中；


绝对和相对...]]></description><category></category></item><item><title><![CDATA[Java-NIO(2)]]></title><link>https://blog.youkuaiyun.com/Coder_py/article/details/105366610</link><guid>https://blog.youkuaiyun.com/Coder_py/article/details/105366610</guid><author>Coder_py</author><pubDate>Tue, 07 Apr 2020 15:56:26 +0800</pubDate><description><![CDATA[Java-NIO(2)
缓冲区
常规I/O操作存在很大缺点，主要是因为它们是阻塞的，而NIO正是为了解决常规I/O执行效率低的问题，采用非阻塞高性能运行的方式来避免出现笨拙的同步I/O带来的效率低的问题
缓冲区Buffer，在NIO的使用中地位很高，因为数据就是放到缓冲区，对数据进行处理的
NIO中的Buffer是一个用于存储基本数据类型的容器，它以类似于数组有序的方式来存储和组织数据，每个基本数...]]></description><category></category></item></channel></rss>