Java实现一个简单的HTTP Server

Java实现一个简单的HTTP Server

1、说明

我们在学习javaweb的时候,通常都会使用Tomcat来做HTTP服务器,那有没有小伙伴在刚刚接触javaEE的时候很是痛恨Tomcat,其实也没有办法啦,不过我们可以简单的来了解下它的原理。我就通过自己写个简单的HTTP Server来解析它的原理。

2、开始编码

首先我们为了能够使用端口,需要程序来开放并监听端口:

public class HttpServerDemo {
    public static void main(String[] args) throws Exception {
        //首先创建服务端,打开8081端口
        final ServerSocket server = new ServerSocket(8081);
        }
        }

这里为了和Tomcat区别所以使用了8081端口。
打开了服务端口我们其实就可以访问http://localhost:8081 了,但是会报错:

could not open connection to the host, on port 8081: connect failed

报错的意思就是不能为服务器打开端口,也就是连接不被允许,那么我们使用 accept方法来放行端口。

while (true){//死循环监听连接
            //调用accept方法,如果没有写这句,
            //报错:could not open connection to the host, on port 8080: connect failed
            final Socket client = server.accept();
            }

此时在访问http://localhost:8081 就可以访问通了,接下来就是接收request请求,

 //1、接收客户端的request请求
            InputStreamReader isr = new InputStreamReader(client.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            String line = reader.readLine();
            while (!line.isEmpty()){
                System.out.println(line);
                line = reader.readLine();
            }

控制台打印接收到的请求数据
图1

接下来我们要生成response数据并且将它发送给客户端,

//2、生成一个response
            Date today = new Date();
            String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
            //3、发送 http response 到客户端
            client.getOutputStream().write(httpResponse.getBytes("UTF-8"));

            //4、关闭socket
            client.close();

浏览器的结果:
图2

其实整体来说,Tomcat也是这么个流程,不过,别人的实现已经很完美了,我们也没必要再去造轮子了。

最后

完整代码:


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 * 一个简单的http服务端
 * @Author: 编程否
 * @Date: 2018/8/12 16:08
 */
public class HttpServerDemo {
    public static void main(String[] args) throws Exception {
        //首先创建服务端,打开8080端口
        final ServerSocket server = new ServerSocket(8081);
        System.out.println("监听端口8080================>");
        while (true){//死循环监听连接
            //调用accept方法,如果没有写这句,
            //报错:could not open connection to the host, on port 8080: connect failed
            final Socket client = server.accept();
            //1、接收客户端的request请求
            InputStreamReader isr = new InputStreamReader(client.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            String line = reader.readLine();
            while (!line.isEmpty()){
                System.out.println(line);
                line = reader.readLine();
            }
            //2、生成一个response
            Date today = new Date();
            String httpResponse = "HTTP/1.1 200 OK\r\n\r\n" + today;
            //3、发送 http response 到客户端
            client.getOutputStream().write(httpResponse.getBytes("UTF-8"));

            //4、关闭socket
            client.close();
        }
    }
}

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright bcfou.com.Some Rights Reserved.