跳到主要内容

一、Netty 教程 – 传统I_O编程(BIO)

作者:唐亚峰 | 出自:唐亚峰博客

> 有一段时间没写博客了,Spring Cloud 基本的都已经写完(后续会写一个SpringBootAdmin的整合),接下来会记录Netty相关的,早期的JAVANIO支持是非常糟糕的,直到2002年发布的JDK1.4中才第一次支持非阻塞I/O,这个类库为JDK通讯模型带来了翻天覆地的变化,在开始学习Netty之前先看看早期的写法是什么样的……

- 网络编程

网络编程的基本模型就是Client/Server模型,两个进程相互通讯,其中服务端提供位置信息(ip:port),客户端通过连接操作向服务端监听的地址发起连接请求,通过三次握手建立连接,如果成功则可以通过网络套字(Socket)进行通信…

- 同步阻塞I/O

采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端链接,由它来接收到每个请求然后为每个客户端创建一个新的线程进行链路处理,处理完毕后通过输出流应答给客户端,然后线程销毁…

 

该模型最大的问题就是缺乏弹性伸缩能力,因为它是1 : 1 模型的,当客户端越多服务端线程开销越大,线程数膨胀后,系统性能就急剧下降了,然后堆栈,GC,等等问题就来找你唠嗑了…

- TimeServer

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 初窥NIO-TimeServer:同步阻塞方式的I/O创建
* @author Levin
*/
public class TimeServer {
public static void main(String[] args) {
int port = 4040;
System.out.println("start server......" + port);
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
while (true) {
new TimeServerHandler(serverSocket.accept()).run();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}