Java笔记-使用ServerSocket构建HTTP服务器

运行截图如下;

浏览器访问:

后端打印:

项目结构如下:

HttpCallback.java

package cn.it1995.http;

public interface HttpCallback {

    byte[] onResponse(String request);
}

 HttpServer.java

package cn.it1995.http;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class HttpServer {

    private boolean mRunning;
    private HttpCallback mCallback;

    public HttpServer(HttpCallback Callback) {

        this.mCallback = Callback;
    }

    public void startHttpServer(){

        if(mRunning){

            return;
        }
        mRunning = true;

        try {

            ServerSocket serverSocket = new ServerSocket(80);
            while (mRunning){

                Socket accept = serverSocket.accept();
                ExecutorService threadPool = Executors.newCachedThreadPool();
                threadPool.execute(new HttpThread(accept, mCallback));
            }
        }
        catch (IOException e) {

            e.printStackTrace();
        }
    }
}

 HttpThread.java

package cn.it1995.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class HttpThread implements Runnable{

    private Socket mSocket;
    private HttpCallback mCallback;

    public HttpThread(Socket socket, HttpCallback httpCallback){

        mSocket = socket;
        mCallback = httpCallback;
    }

    @Override
    public void run() {

        try {

            BufferedReader reader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
            String content;
            StringBuffer request = new StringBuffer();

            while((content = reader.readLine()) != null
                    && !content.trim().isEmpty()){

                request.append(content).append("\n");
            }

            System.out.println("request:\n" + request);
            byte[] response = new byte[0];
            if(mCallback != null){

                response = mCallback.onResponse(request.toString());
            }

            String responseFirstLine = "HTTP/1.1 200 OK \r\n";
            String responseHead = "Content-type:" + "text/html" + "\r\n";
            OutputStream outputStream = mSocket.getOutputStream();
            outputStream.write(responseFirstLine.getBytes());
            outputStream.write(responseHead.getBytes());
            outputStream.write("\r\n".getBytes());
            outputStream.write(response);

            mSocket.close();
        }
        catch (IOException e) {

            e.printStackTrace();
        }
    }
}

 Main.java

package cn.it1995;

import cn.it1995.http.HttpCallback;
import cn.it1995.http.HttpServer;

public class Main {

    public static void main(String[] args) {

        System.out.println("start http server");
        HttpServer server = new HttpServer(new HttpCallback() {
            @Override
            public byte[] onResponse(String request) {

                return "Hello World".getBytes();
            }
        });

        server.startHttpServer();
    }
}

 

源码打包下载地址:

https://github.com/fengfanchen/Java/tree/master/Server

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值