BIO模型
BIO通信模型
传统的BIO模型(同步阻塞IO模型)+线程池(多线程)模式:适合活动连接次数不是特别高。该模式是1:1,即每次连接每个线程。
处理步骤:客户端发送请求,接收器Acceptor每接收一个请求,就创建一个新线程,处理完成之后,再通过输出流返回到客户端,然后销毁线程。
缺陷:一个客户端请求,就对应一个线程,客户端的请求和服务端的线程就成为1:1的比例,当请求过多的时候,线程越来越多,最后导致JVM的内存被大量的占用,堆栈溢出,发生异常。
代码演示:
public class Test0221_TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket();
serverSocket.bind(new InetSocketAddress(3333));
try {
while (true) {
Socket socket = serverSocket.accept();
System.out.println(socket.getLocalAddress() + "连接成功");
new Thread(new Test0221(socket)).start();
}
}finally{
if(serverSocket!=null)
System.out.println("服务器关闭了");
serverSocket.close();
}
}
}
public class Test0221 implements Runnable {
private Socket socket;
public Test0221(Socket socket){
this.socket=socket;
}
@Override
public void run() {
try {
while (true) {
BufferedInputStream inputStream = new BufferedInputStream(socket.getInputStream());
byte[] bytes = new byte[1024];
int read = inputStream.read(bytes, 0, 1024);
String result = new String(bytes, 0, read);
System.out.println(">>>" + result);
}
} catch(IOException e){
e.printStackTrace();
}
}
}
public class Test0221_TCPClient {
public static void main(String[] args) throws IOException {
Socket socket=new Socket();
socket.connect(new InetSocketAddress("127.0.0.1",3333));
Scanner scanner=new Scanner(System.in);
scanner.useDelimiter("\n");
String nsg;
BufferedOutputStream outputStream=new BufferedOutputStream(socket.getOutputStream());
while (scanner.hasNext()){
nsg=scanner.nextLine();
outputStream.write((nsg+"\n").getBytes());
outputStream.flush();
}
outputStream.close();
socket.close();
}
}