目录
1.传统的io实现demo
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8080);
System.out.println("服务端已经开启");
while (true) {
Socket socket = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String buffer = null;
while ((buffer = br.readLine()) != null && !buffer.equals("")) {
System.out.println(buffer);
}
Charset charset = Charset.forName("UTF-8");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), charset));
bw.write("HTTP/1.1 200 OK\n");
bw.write("Content-Type: text/html;charset=UTF-8\n\n");
bw.write("BIO success");
bw.flush();
bw.close();
br.close();
socket.close();
}
}
这个demo可以用telnet或者浏览器去连接,但浏览器在连接的同时就发送了信息过去
首先,这是阻塞的,阻塞的地方有两个:一个是server.accept();另一个是br.readLine(),也就是说必须要连接进来,并且输出数据,否则就一直停在这里。换句话说就是,这个主线程只能处理这一个连接,在处理完这个连接之前,任何其他连接都别想进来。这就是阻塞。tomcat在新版本里已经完全不支持这种传统io模式了,之前的老版本里默认使用的是bio,因为tomcat使用的都是短连接,发送接收都很快,所以可以处理完这个连接后马上处理下一个连接,而且tomcat还使用了连接池,所以就可以支持更多连接的接入。但,这一切都没能阻止tomcat抛弃bio。(大家在启动tomcat时可以看到控制台的提示目前是使用nio还是bio连接)
2.nio实现demo
public class NIOServer {
private Selector selector;
public void init() throws IOException {
// 创建一个选择器
this.selector = Selector.open();
// 使用通道计划,服务器
ServerSocketChannel channel = ServerSocketChannel.open();
// 这个通道非常高效,所以要非阻塞
channel.config