使用BIO建立简单的http服务器

平时在使用tomcat、jetty时,只是使用里面的servlet、filter等,从来没想过它们如何同浏览器进行交互的。工作中遇到一些问题,在同其它同事交流及学习源码的过程中,才明白底层原来走的也是socket,才知道所谓的NIO是什么。。。

了解NIO之前,肯定得先了解BIO,出于学习的目的 ,使用BIO写一个简单的http服务器DEMO:浏览器输入任何请求,后台打印出请求信息并在浏览器中输出Hello World

 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.OutputStream;
 7 import java.io.OutputStreamWriter;
 8 import java.net.InetSocketAddress;
 9 import java.net.ServerSocket;
10 import java.net.Socket;
11 
12 public class BioServer {
13     private ServerSocket serverSocket;
14     
15     private String ip;
16     
17     private int port;
18     
19     public BioServer(String ip, int port) {
20         this.ip = ip;
21         this.port = port;
22     }
23     
24     public void startListen() throws IOException {
25         serverSocket = new ServerSocket();
26         serverSocket.bind(new InetSocketAddress(ip, port)); //创建对指定端口及IP的监听
27         
28         while (true) {
29             accept();
30         }
31     }
32     
33     private void accept() throws IOException {
34         //收到客户端的请求
35         Socket socket = serverSocket.accept();
36         
37         //输入流用于接收客户端传输过来的数据
38         InputStream in = socket.getInputStream();
39         InputStreamReader reader = new InputStreamReader(in);
40         BufferedReader br = new BufferedReader(reader);
41         String line = null;
42         while ((line = br.readLine()) != null) {
43             System.out.println(line);
44             //按照HTTP协议,请求头和请求体之间为一空行分隔
45             if ("".equals(line)) {
46                 break;
47             }
48         }
49         
50         //输出流用于向客户端发送响应消息,需遵从HTTP协议格式
51         OutputStream out = socket.getOutputStream();
52         OutputStreamWriter writer = new OutputStreamWriter(out);
53         BufferedWriter bw = new BufferedWriter(writer);
54         bw.write("HTTP/1.1 200 OK\n");
55         bw.write("Content-Type: text/html; charset=UTF-8\n");
56         bw.write("\n");
57         bw.write("<html>");
58         bw.write("<head>");
59         bw.write("<title>");
60         bw.write("BIO Http Server");
61         bw.write("</title>");
62         bw.write("</head>");
63         bw.write("<body>");
64         bw.write("<h1>Hello World!</h1>");
65         bw.write("</body>");
66         bw.write("</html>");
67         
68         //必须在请求读取和响应写入都处理完毕之后才可以调用close方法,将输入流关闭也会导致输出流不可用
69         bw.close();
70         writer.close();
71         out.close();
72         br.close();
73         reader.close();
74         in.close();
75         socket.close();
76     }
77     
78     public static void main(String[] args) {
79         BioServer server = new BioServer("127.0.0.1", 8080);
80         try {
81             server.startListen();
82         } catch (IOException e) {
83             e.printStackTrace();
84         }
85     }
86 }

 

posted @ 2017-10-22 17:34  smart_妖  阅读(853)  评论(0编辑  收藏  举报