帆的博客

扬帆起航

Netty源码分析

跟着代码的编写和运行流程来看看Netty的源码和原理,这里面包含了大量NIO的知识,所以我们要对NIO的基础知识要有掌握,不然看Netty的源码是很难受的。那么我们从哪里开始阅读源码呢,既然不知道从何下手,就从运行的例子一个一个往下看吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MyServer {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.WARN))
.childHandler(new MyServerInitializer());

ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
阅读全文 »

NIO 零拷贝

OIO在读取文件传输的时候,在操作系统中发生了多次上下文的切换和多次的数据拷贝。

BIO在读取文件的流程图

阅读全文 »

用git已经差不多3年了,回顾一下。

https://git-scm.com/

这个是Git的官网,Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git的读音为/gɪt/。

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。

阅读全文 »

做过web开发的人一定遇到过中文乱码的问题,一般情况下我们都是直接把所有的编码都设置成UTF-8,可是并没有真正的去理解为什么会导致乱码的问题,这里一起研究一下编码和解码究竟是怎么一回事。

这段代码很简单,就是读取一个文件的内容,然后输出到另外一个文件里面。

阅读全文 »

接下来看看如何用NIO来做一个模拟聊天,通过这个例子来更加理解NIO的使用方式,下面展示了服务端代码,用命令进行测试,然后再用NIO的方式编写客户端进行测试,对NIO的服务端和客户端的开发,都更加深入的理解。

阅读全文 »

参考:http://blog.csdn.net/lianjiww/article/details/53540145

Selector

NIO的三大组件Channel、Buffer、Selector已经讲了2个了,接着我们一起探索一下Selector。

Selector(选择器)是Java NIO的一个组件,能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源。因此,使用的线程越少越好。

Selector的创建

通过调用Selector.open()方法创建一个Selector,例如:

1
Selector selector = Selector.open();
阅读全文 »

DirectBuffer

之前我们用ByteBuffer.allocate()看一下源码:

1
2
3
4
5
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}

HeapByteBuffer是从堆上分配的内存空间创建的Buffer,实际上JDK还提供了另外一种方式ByteBuffer.allocateDirect():

1
2
3
public static ByteBuffer allocateDirect(int capacity) {
return new DirectByteBuffer(capacity);
}
阅读全文 »

Buffer

java NIO中的Buffer用于和NIO通道进行交互。数据从通道读入到缓冲区,从缓冲区写入到通道中。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

之前代码里面用到了ByteBuffer,实际上ByteBuffer不只是可以放byte在里面,也可以放别的类型数据,但是取出来的时候必须跟放进去的类型顺序也保持一致,否则会报错。(BufferUnderflowException)

put & get

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class NioTest5 {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(64);

buffer.putInt(15);
buffer.putLong(50000000L);
buffer.putDouble(14.123123);
buffer.putChar('好');
buffer.putShort((short) 2);
buffer.putChar('的');

buffer.flip();

System.out.println(buffer.getInt());
System.out.println(buffer.getLong());
System.out.println(buffer.getDouble());
System.out.println(buffer.getChar());
System.out.println(buffer.getShort());
System.out.println(buffer.getChar());

}
}
阅读全文 »

Java NIO

“对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。”
――《Think in Java》

下面一起来研究一下NIO的用法,先来一段示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class NioTest1 {
public static void main(String[] args) {
IntBuffer buffer = IntBuffer.allocate(10);
for (int i = 0; i < buffer.capacity(); i++) {
int randomNumber = new SecureRandom().nextInt(20);
buffer.put(randomNumber);
}

buffer.flip();

while (buffer.hasRemaining()) {
System.out.println(buffer.get());
}
}
}
阅读全文 »

Spring Boot Admin

Kotlin版本

Java版本

简介

简单的后台开发模板框架,具备用户管理,菜单管理和角色管理3个功能,权限控制到按钮层级。

采用JWT+Spring Security进行权限验证和会话保持
项目基于Spring Boot+Mybatis+BootStrap+DataTables

前端代码不是我自己写的,后端有Kotlin和Java两个版本,Kotlin对Java生态的兼容比较好,我是先做的Java版,只花了一点时间就把Java版本’复制‘成了Kotlin版本。

阅读全文 »
0%