NIO和Netty全文
BIO
- blocking IO,同步阻塞,一个链接一个线程,通过线程池连接,实现多个客户连接服务器,实现并发
- 编程流程
- 服务器端启动
- 客户端启动,对服务器进行连接,默认情况下服务器需要对每个客户建立一个线程,与其通信
- 客户端发出请求后,先咨询服务器是否有线程响应,如果没有,则等待,或者被拒绝
- 如果有响应,客户端线程会等待请求结束后,继续执行
- curl发送字符串
curl -d dwads 127.0.0.1:6666 - 安装telnet
brew install telnet
control+] 进入telnet客户端
public void Server() throws IOException {
//创建线程池
ExecutorService es = Executors.newCachedThreadPool();
ServerSocket ss = new ServerSocket(6666);
System.out.println("服务器启动");
while(true) {
//监听
final Socket socket = ss.accept();
System.out.println("连接到一个客户端");
//创建线程
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread());
handler(socket);
}
});
}
}
//客户端通信
public static void handler(Socket socket) {
byte[] bytes = new byte[1024];
InputStream is = null;
try {
is = socket.getInputStream();
//读取,阻塞
int read = is.read(bytes);
while (read != -1) {
System.out.println(new String(bytes, 0, read));
read = is.read(bytes);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//关闭
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问题
- 每个请求都需要创建独立的线程,与对应的客户端进行数据交互
- 并发数较大时,需要创建大量的线程来处理连接,系统资源占用大
- 建立连接后,如果无数据可读,就会阻塞到read上,造成线程资源浪费