基于socket的Http服务器

基于socket的Http服务器

类似tomcat,做一次socket的 one req—> one Thread—> http 协议解析和响应

代码

//创建socket的服务端
@Slf4j
public class Server {

	private static ServerSocket server = null;

	static {
		synchronized (Server.class) {
			if (server == null)
				try {
					server = new ServerSocket(ServerParams.PORT);
				} catch (IOException e) {
					log.error("创建socket监听端口失败...", e);
				}
		}
	}

	static void init() throws Exception {
		HttpThread.init();
		while (true) {
			Socket client = server.accept();
			// 将请求仍入线程池
			HttpThread.exec(client);
		}
	}
}

//处理请求线程
@Slf4j
@AllArgsConstructor
public class SocketThread implements Runnable {
	private Socket client;

	@Override
	public void run() {
		String hostname = client.getInetAddress().getHostName();
		log.info("有客户端接入:{}", hostname);
		BufferedReader reder = null;
		PrintWriter out = null;
		try {
			// 获取客户端输入内容
			reder = new BufferedReader(new InputStreamReader(client.getInputStream()));
			char[] msg = new char[1024];
			StringBuffer sb = new StringBuffer();
			if ((reder.read(msg) != -1)) {
				sb.append(new String(msg));
			}
			log.info("客户端输入:{}", sb);

			// 响应客户端输入内容
			sb = new StringBuffer();
			out = new PrintWriter(client.getOutputStream());
			sb.append(HttpOutPut.OUTPUT_HEADERS).append(HttpOutPut.OUTPUT.length())
					.append(HttpOutPut.OUTPUT_END_OF_HEADERS).append(HttpOutPut.OUTPUT);
			out.println(sb.toString());
			out.flush();
		} catch (IOException e) {
			log.error("获取客户端输入内容失败...", e);
		} finally {
			if (reder != null) {
				try {
					reder.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (out != null) {
				out.close();
			}

		}
	}

}

//线程池
@Slf4j
public class HttpThread {

	public static ThreadPoolExecutor pool = null;

	public static void init() {
		synchronized (HttpThread.class) {
			if (pool == null) {
				pool = new ThreadPoolExecutor(PoolParams.corePoolSize, PoolParams.maximumPoolSize,
						PoolParams.keepAliveTime, PoolParams.unit, PoolParams.workQueue);
			}
			log.info("线程池初始化完成...");
		}
	}

	public static void exec(Socket socket) {
		pool.execute(new SocketThread(socket));
	}

}
//http协议返回头信息和固定返回内容包装
public final class HttpOutPut {
	public static final String OUTPUT = "<html><head><title>Example</title></head><body><p>I am Worked!!!</p></body></html>";

	public static final String OUTPUT_HEADERS = "HTTP/1.1 200 OK\r\n" + "Content-Type: text/html\r\n"
			+ "Content-Length: ";

	public static final String OUTPUT_END_OF_HEADERS = "\r\n\r\n";
}

测试

基于socket的Http服务器

初步解析http协议成功,返回后续解析url和http content-type http-method 等细节.

代码托管 码云