BIO(同步阻塞IO)基本流程
(1)客户端启动Socket对服务器进行通信,默认服务器端需要对每个客户端建立一个线程与之通信。
(2)客户端发出请求后,先咨询服务端是否有线程响应,如果没有则会等待,或者被拒绝。
BIO的缺点:
(1)每个请求都需要创建独立的线程,与对应的客户端进行数据Read或者Write
(2)当并发数较大时,需要创建大量线程来处理连接,系统资源占用较大
(3)连接建立后,如果当前线程暂时没有数据可读,则线程就阻塞在Read操作上,造成线程资源的浪费。
代码:
public class BIODemo {
public static void main(String[] args) throws IOException {
ExecutorService threadPool = Executors.newCachedThreadPool();
//创建serverSocket
ServerSocket serverSocket=new ServerSocket(6666);
System.out.println("服务器启动了。。。");
while (true){
Socket socket=serverSocket.accept();
System.out.println("客户端连接进来了");
threadPool.submit(()->{
handler(socket);
});
}
}
private static void handler(Socket socket){
byte[] bytes=new byte[1024];
try {
InputStream inputStream = socket.getInputStream();
int len;
while ((len=inputStream.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}