简单撸一个Android Https服务器

187 阅读1分钟

具体代码如下:

import java.io.IOException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.net.ssl.SSLContext;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class AndroidHttpsServer {
    private static final int PORT = 8443;
    private static final Executor executor = Executors.newFixedThreadPool(5);
    private final SSLContext sslContext;
    private final OkHttpClient client;

    public AndroidHttpsServer() throws IOException {
        sslContext = SSLContext.getDefault();
        client = new OkHttpClient.Builder()
            .sslSocketFactory(sslContext.getSocketFactory(), null)
            .hostnameVerifier((s, sslSession) -> true)
        .build();
    }

    public void start() {
        final Server server = new Server(PORT);
        server.start();
        executor.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        final Call call = client.newCall(new Request.Builder()
                            .url("https://localhost:" + PORT + "/")
                            .build());
                        call.enqueue(new Callback() {
                            @Override
                            public void onFailure(Call call, IOException e) {
                                System.out.println("Call failed: " + e.getMessage());
                            }

                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
                                System.out.println("Received response: " + response.body().string());
                            }
                        });
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) throws IOException {
        new AndroidHttpsServer().start();
    }

    private static class Server {
        private final int port;
        private final ServerSocket serverSocket;

        public Server(int port) throws IOException {
            this.port = port;
            serverSocket = new ServerSocket(port);
        }

        public void start() {
            System.out.println("Server started on port " + port);
            try {
                while (true) {
                    final Socket socket = serverSocket.accept();
                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                handleRequest(socket);
                            } catch (IOException e) {
                                e.printStackTrace();
                            } finally {
                                try {
                                    socket.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        private void handleRequest(final Socket socket) throws IOException {
            final PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            final BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String requestLine = reader.readLine();
            final Request request = new Request.Builder()
                .url(requestLine)
                .build();
            final Call call = client.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    writer.println("HTTP/1.1 500 Internal Server Error");
                    writer.println("Content-Length: 0");
                    writer.println();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String responseBody = response.body().string();
                    writer.println("HTTP/1.1 200 OK");
                    writer.println("Content-Length: " + responseBody.length());
                    writer.println();
                    writer.println(responseBody);
                }
            });
        }
    }
}
```
```