本文主要讲述Netty相关概念及为什么会出现Netty,Netty的作用有哪些等?以及学习Netty需要什么。
前言:
我其实更好奇的是:你是因为什么点进了这篇博客,是想要了解Netty;或者是因为自己本心中的好奇心;亦或者是业务场景中需要用Java网络编程,然后百度搜索,搜到了Netty。
如果你想要了解,这篇文章我想是适合你的。如果你是想要满足自己的好奇心,想要深究一番的,那么这篇就是Netty的开山篇。如果是业务中需要用到Netty框架,并且已经有了好的基础,我想可以直接跳过这一篇,直接进入实战加设计理论篇可能会更好。
我想要学习Netty框架一方面是因为好奇框架中服务与服务之间的通信,一直是处于懂得使用,而不懂其然的状态;另一方面是我想掌握这个技术,想自己琢磨出点东西,写一点属于自己的东西,扩展自己的知识面,Netty正好与我不谋而合,所以我来了。
建议:学习Netty框架最好是已经对Java IO编程、网络编程、多线程编程有一定了解。
Netty 官网
一、Java网络编程
1.1、Java BIO
最早期的 Java API(java.net)只支持由本地系统套接字库提供的所谓的阻塞函数。
简单示例:
代码语言:javascript复制/**
* @Author: crush
* @Date: 2021-08-23 11:51
* version 1.0c
*/
public class BioServer {
public static void main(String[] args) throws Exception {
//1、创建ServerSocket
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
//2、监听 等待客户端连接。 该方法阻塞,直到建立连接。
final Socket socket = serverSocket.accept();
System.out.println("连接到一个客户端");
//3、就创建一个线程,与之通讯(单独写一个方法)
new Thread(() -> {
//4、可以和客户端通讯
handler(socket);
}).start();
}
}
/**
* 编写一个handler方法,和客户端通讯,读取客户端发过来的信息
* @param socket
*/
public static void handler(Socket socket) {
try {
byte[] bytes = new byte[1024];
//通过socket获取输入流
InputStream inputStream = socket.getInputStream();
//循环的读取客户端发送的数据
while (true) {
//从输入流中读取一定数量的字节并将它们存储到缓冲区数组b 。
//实际读取的字节数作为整数返回。
//此方法会阻塞,直到输入数据可用、检测到文件结尾或抛出异常。
int read = inputStream.read(bytes);
if (read != -1) {
//处理客户端发送的数据::输出客户端发送的数据
System.out.println(new String(bytes, 0, read));
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
说几个比较重要的点:
ServerSocket
上的accept()
方法将会一直阻塞到一个连接建立 ,随后返回一个 新的Socket
用于客户端和服务器之间的通信。该ServerSocket
将继续监听传入的 连接。InputStream
流处理方式.read()
方式将会阻塞,直到在 处一个由换行符或者回车符结尾的字符串被 读取。- 处理客户端发送的数据。
需要注意到的点
:
这段代码只能同时处理一个连接,如果要管理多个客户端,需要为每个Socket
创建一个Thread。我们可以画出它的模型图了,如下:
这有什影响呢?
第一、在任何时候都可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,会造成资源极大的浪费。
第二、Java需要为每个线程的调用栈都分配内存,其默认值大小区间为 64 KB 到 1 MB,具体取决于操作系统,超过1000的话,可能JVM的内存都会被干掉一半。
第三、即使 Java 虚拟机(JVM)在物理上可以支持非常大数量的线程,但是远在到达该极限之前,上下文切换所带来的开销就会带来麻烦。
这种模式比较适用于中小型的并发,一旦到了成千上万的话,效果就会非常不理想了,更多的话甚至就是糟糕啦。
当然Java已经发展这么多年了,不可能不突破的哈,在jdk1.4的时候就增加了Java NIO
。
如果还想了解一下Java BIO网络编程可以点