实现一个自己的HTTP服务器

实现一个HTTP服务器 ,这里我们用到TCP的服务器 再按照HTTP协议的规则来实现一个服务器
代码如下:

/*
实现自己的http服务器
 */
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class MyHttpServer {

    // TCP 的服务器, 按照HTTP 协议的规则进行数据的获取和返回 = HTTP 服务器
    private ServerSocket serverSocket = null;
    public MyHttpServer(int port) throws IOException {
        //创建一个TCP的服务器
        serverSocket = new ServerSocket(port);
    }
    // 创建一个开始的方法
    public void start() throws IOException {
        System.out.println("服务器已启动");
        // 运用线线程池来提高服务  一个请求过来 使用一个线程
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(100,100,100,
                TimeUnit.SECONDS, new LinkedBlockingQueue<>(1000));
        while(true) {
            Socket clientSocket = serverSocket.accept();
            threadPoolExecutor.submit(()->{
               try {
                   processSocket(clientSocket);
               } catch (IOException e) {
                   e.printStackTrace();
               }
            });
        }
    }

    private void processSocket(Socket clientSocket) throws IOException {

        try (
                BufferedReader reader  = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter  writer = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
        ) {
            //获取首行信息   request 请求行 Method URL Version
            String firstLine = reader.readLine();
            String[] firstLineArr = firstLine.split(" ");
            //请求方法
            String method = firstLineArr[0];
            //URl
            String url = firstLineArr[1];
            //版本号
            String version = firstLineArr[2];
            System.out.println(String.format("method=%s,url=%s,version=%s",method,url,version));
            // 2.请求头
            Map<String,String> reqHead = new HashMap<>();
            String item ;
            while ((item = reader.readLine()) !=null && item.length() > 0) {
                String[] itemArr = item.split(": ");
                reqHead.put(itemArr[0],itemArr[1]);
            }
            //4.body 暂不考虑
            //二 响应
            writer.println("HTTP/1.1 200 OK"); //1.首行信息
            //响应头
            // Content—Type
            // Content-Length.
            writer.println("Content-Type: text/html;charset=utf-8");

            String body = "<h1>你好,咪咪<h1>"; //这里是写想要网页显示的内容
            writer.println("Content-Length: "+ body.getBytes().length); // 注意 这里是字节长度,不是字符长度
            // 空行
            writer.println();
            //4.body
            writer.println(body);
            //刷新缓冲区
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            clientSocket.close();
        }
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个IOCP(Input/Output Completion Port)服务器,需要按照以下步骤进行: 1. 创建一个监听套接字(listening socket)并绑定到本地IP地址和端口号上。 2. 创建一个完成端口(completion port)并将监听套接字与之关联。 3. 开始监听连接请求,当有客户端连接请求到达时,接收连接,创建一个新的套接字(client socket),并将其与完成端口关联。 4. 将新创建的套接字(client socket)加入到IOCP中,以便异步地接收客户端的数据请求。 5. 当客户端请求到达时,使用异步I/O操作,从套接字中读取数据,并将读取请求与完成端口关联。 6. 当读取完成时,将读取请求与处理请求的工作线程关联,并将读取到的数据传递给处理线程进行处理。 7. 处理线程完成数据的处理后,将处理结果写回客户端,使用异步I/O操作将写入请求与完成端口关联。 8. 当写入完成时,将写入请求与处理请求的工作线程关联,完成整个请求处理过程。 在实现IOCP服务器时,需要注意以下几点: 1. 应避免使用阻塞I/O操作,使用异步I/O操作以提高服务器的并发性能。 2. 应充分利用完成端口和线程池等技术,提高服务器的吞吐量和可扩展性。 3. 应实现适当的协议处理逻辑,以保证服务器能够正确地处理客户端请求。 4. 应对客户端请求进行适当的安全性检查,以确保服务器的安全运行。 5. 应实现适当的错误处理逻辑,以便及时发现和处理服务器中的错误和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值