- 模型问题:缺乏弹性伸缩连接,当客户端并发访问量增加后,服务端的线程个数是和客户端访问并发数呈1:1的关系,由于服务器资源有限,当线程膨胀后,系统性能急剧下降,发发生堆栈溢出、创建新线程失败等问题,最终导致宕机,
package bio;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class BioServer {
public static void main(String[] args) throws IOException {
//创建线程池
ExecutorService newcatchTreadPool = Executors.newCachedThreadPool();
ServerSocket serverSocket = new ServerSocket(666);
System.out.println("服务器启动");
while (true){
System.out.println("等待socket连接");
Socket socket = serverSocket.accept(); //阻塞 未连接时会一直阻塞在这个
System.out.println("客户端连接socket成功");
//创建线程与客户端通信
newcatchTreadPool.execute(new Runnable() {
@Override
public void run() {
//可以与客户端通信
try {
hander(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
}
//编写hander处理通讯
public static void hander(Socket socket) throws IOException {
try {
System.out.println("线程信息"+ Thread.currentThread().getId()+"线承名字"+Thread.currentThread().getName());
byte[] bytes =new byte[1024];
//通过socket获得输入流
InputStream inputStream =socket.getInputStream();
while (true){
System.out.println("read..........");
int read = inputStream.read(bytes);//阻塞 连接后没有发数据会阻塞这路
if(read != -1){
System.out.println(new String(bytes,0,read));
}else{
break;
}
}
}catch (IOException e){
socket.close();
}
}
}
NIO模型 buffer和channel进行数据双向读写,nio通过buffer实现非阻塞,面向缓存区编程。主线程等待客户端接,并分配子线程
selecter管理多个通道,可以获取到通道的事件(用一个线程处理多个连接)



