基于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";
}
测试
初步解析http协议成功,返回后续解析url和http content-type http-method 等细节.
代码托管 码云