java Socket实现简单模拟HTTP服务器

发布时间 - 2026-01-11 01:03:29    点击率:

最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用Java Socket API 模拟做一个HTTP服务器,巩固一下应用层的知识。

HTTP基于TCP协议,协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容——百度百科。
话不多说,还是直接上图。

具体字段这里不作解释,不懂的请先自己了解http协议。这里主要是根据请求响应这一过程模拟HTTP服务器。

下面是代码:

package com.example.httpserver;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServer {
  private static final Integer port = 80;//HTTP默认端口80

  public static void main(String[] args) {
    ServerSocket serverSocket;

    try {
      //建立服务器Socket,监听客户端请求
      serverSocket = new ServerSocket(port);
      System.out.println("Server is running on port:"+serverSocket.getLocalPort());
      //死循环不间断监听客户端请求
      while(true){
        final Socket socket = serverSocket.accept();
        System.out.println("biuld a new tcp link with client,the cient address:"+ 
            socket.getInetAddress()+":"+socket.getPort());
        //并发处理HTTP客户端请求
        service(socket);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void service(Socket socket)
  {
    new Thread(){
      public void run(){
        InputStream inSocket;
        try {
          //获取HTTP请求头
          inSocket = socket.getInputStream();
          int size = inSocket.available();
          byte[] buffer = new byte[size];
          inSocket.read(buffer);
          String request = new String(buffer);
          System.out.println("ClientBrowser:\n"+request+"\n"
              + "------------------------------------------------------------------");

          String firstLineOfRequest = "";
          String[] heads;
          String uri = "/index.html";
          String contentType ="";
          if(request.length() > 0){
            firstLineOfRequest = request.substring(0,request.indexOf("\r\n"));
            heads = firstLineOfRequest.split(" ");
            uri = heads[1];

            if(uri.indexOf("html") != -1){
              contentType = "text/html";
            }else{
              contentType = "application/octet-stream";
            }
          }
          //将响应头发送给客户端
          String responseFirstLine = "HTTP/1.1 200 OK\r\n";

          String responseHead = "Content-Type:" + contentType +"\r\n";

          OutputStream outSocket = socket.getOutputStream();
          System.out.println("ServerResponse:\n"+responseFirstLine+"\n"+responseHead+"\n"
              + "--------------------------------------------------------------------");
          outSocket.write(responseFirstLine.getBytes());
          outSocket.write(responseHead.getBytes());
          //通过HTTP请求中的uri读取相应文件发送给客户端
          FileInputStream writehtml = new FileInputStream(new File("wwwroot"+uri));
          outSocket.write("\r\n".getBytes()); 
          byte[] htmlbuffer = new byte[writehtml.available()];
          if(writehtml !=null){
            int len = 0;
            System.out.println("writeHtml");
            while((len = writehtml.read(htmlbuffer)) != -1){
              outSocket.write(htmlbuffer, 0,len);
            }
          }
          outSocket.close();
          socket.close();

        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }.start();
  }

}

代码看注释也很容易理解。现在我们在浏览器中输入服务器地址+要访问的文件

在看我们控制台输出的内容:

以上就是Java Socket 简单的模拟HTTP服务器全过程。希望对大家的学习有所帮助,也希望大家多多支持。


# java  # socket  # 模拟http  # http  # java编写Http服务器下载工具  # Java使用NioSocket手动实现HTTP服务器  # Java/Android 实现简单的HTTP服务器  # Java 如何实现一个http服务器  # Java模拟实现HTTP服务器项目实战  # Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐)  # Java创建非阻塞的HTTP服务器的实现  # 客户端  # 应用层  # 这一  # 不懂  # 请先  # 也很  # 看我  # 采用了  # 做一个  # 不作  # 多说  # 类似于  # 内容包括  # 大家多多  # 理论知识  # 上图  # 主要是  # 发送给  # 器中  # 修饰符 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何续费美橙建站之星域名及服务?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何在VPS电脑上快速搭建网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何配置任务调度?(Cron Job示例)  Python并发异常传播_错误处理解析【教程】  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  iOS UIView常见属性方法小结  深圳网站制作培训,深圳哪些招聘网站比较好?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何解决hover在ie6中的兼容性问题  Laravel如何实现事件和监听器?(Event & Listener实战)  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  如何快速查询域名建站关键信息?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  nodejs redis 发布订阅机制封装实现方法及实例代码  如何在景安服务器上快速搭建个人网站?  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel怎么在Blade中安全地输出原始HTML内容  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何快速配置高效服务器建站软件?  微信小程序 HTTPS报错整理常见问题及解决方案  🚀拖拽式CMS建站能否实现高效与个性化并存?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  javascript中闭包概念与用法深入理解  微信小程序 五星评分(包括半颗星评分)实例代码  个人摄影网站制作流程,摄影爱好者都去什么网站?  javascript读取文本节点方法小结  jQuery validate插件功能与用法详解  网站建设要注意的标准 促进网站用户好感度!  网站制作壁纸教程视频,电脑壁纸网站?  linux top下的 minerd 木马清除方法  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  怎么用AI帮你设计一套个性化的手机App图标?