文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在java项目中使用 Socket如何实现模拟一个HTTP服务器

2023-05-31 15:09

关注

这篇文章给大家介绍在java项目中使用 Socket如何实现模拟一个HTTP服务器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

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

在java项目中使用 Socket如何实现模拟一个HTTP服务器

具体字段这里不作解释,不懂的请先自己了解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();  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯