`
天使的左手
  • 浏览: 55874 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

实现一个简易的http模拟器

阅读更多
/**
 * http模拟器
 * 模拟发送http请求和接收http响应
 */

public class HttpSimulator
{
    //主机
    private String host = "localhost";
    //端口
    private int port = 80;
    //是否为post请求方式
    private boolean isPost;
    //是否为head请求方式
    private boolean isHead;
    //记录从控制台输入的请求消息
    private StringBuilder requestMessage = new StringBuilder();
    private Socket socket;
    //换行符
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    public void run() throws IOException
    {
        BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
        try
        {
            while (true)
            {
                //解析host和port
                if (!readRequestHostAndPort(consoleReader))
                    return;
                //解析http request
                readHttpRequest(consoleReader);
                //发送http request
                sendHttpRequest();
                //读取http response
                readHttpResponse(consoleReader);
            }
        }
        finally
        {
            if (consoleReader != null)
            {
                try
                {
                    consoleReader.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    private boolean readRequestHostAndPort(BufferedReader consoleReader) throws IOException
    {
        System.out.print("host:port>");
        String content = consoleReader.readLine();

        if ("q".equals(content))
            return false;

        //解析host和port 如果没有输入 使用默认值
        String[] parts = content.split(":");
        String host_str = parts[0].trim();
        if (host_str.length() > 0)
            host = host_str;
        if (parts.length > 1)
            port = Integer.parseInt(parts[1].trim());
        return true;
    }

    private void readHttpRequest(BufferedReader consoleReader) throws IOException
    {
        System.out.println("-----------------Request Header-----------------");
        String content = consoleReader.readLine();

        //解析请求行 获取请求方式 POST? HEAD?
        requestMessage.append(content).append(LINE_SEPARATOR);
        String[] parts = content.split(" +");
        String method = parts[0].trim();
        isPost = "POST".equals(method);
        isHead = "HEAD".equals(method);

        //读取控制台输入的请求头信息 当读到"" 结束循环
        while (!"".equals(content = consoleReader.readLine()))
            requestMessage.append(content).append(LINE_SEPARATOR);
        requestMessage.append(LINE_SEPARATOR);

        //如果是post请求 继续读取请求体内容
        if (isPost)
        {
            while (!"".equals(content = consoleReader.readLine()))
                requestMessage.append(content).append(LINE_SEPARATOR);
        }
    }

    private void sendHttpRequest() throws IOException
    {
        socket = new Socket();
        System.out.println("connecting " + host + ":" + port);
        //设置read超时3000毫秒
        socket.setSoTimeout(3000);
        //设置连接超时5000毫秒
        socket.connect(new InetSocketAddress(host, port), 5000);

        //发送http请求
        PrintWriter out = new PrintWriter(socket.getOutputStream());
        out.println(requestMessage.toString());
        out.flush();
        socket.shutdownOutput();
        //清空已经发送的http消息
        requestMessage.delete(0, requestMessage.length());
    }

    private void readHttpResponse(BufferedReader consoleReader) throws IOException
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = null;
        boolean headReaded = false;
        System.out.println("-----------------Response Header-----------------");
        try
        {
            //读取响应内容(状态行、响应头、响应体)
            while (null != (line = in.readLine()))
            {
                //读到"" 表明响应头读取结束 headReaded赋值为true 且不是HEAD请求 处理响应消息 
                if ("".equals(line) && !headReaded && !isHead)
                {
                    System.out.print("Show Data? ");
                    String confirm = consoleReader.readLine();
                    headReaded = true;
                    if ("Y".equals(confirm.toUpperCase()))
                    {
                        System.out.println("-----------------HTTP Response Data-----------------");
                        System.out.println(line);
                        continue;
                    }
                    else
                        break;
                }
                else
                {
                    System.out.println(line);
                }
            }
        }
        finally
        {
            socket.close();
        }
    }

    public static void main(String[] args) throws IOException
    {
        new HttpSimulator().run();
    }
}



运行结果:
host:port>localhost:8080
-----------------Request Header-----------------
GET /test_web/test.html HTTP/1.1
Host:

connecting localhost:8080
-----------------Response Header-----------------
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"259-1397034177525"
Last-Modified: Wed, 09 Apr 2014 09:02:57 GMT
Content-Type: text/html
Content-Length: 259
Date: Tue, 15 Apr 2014 07:22:38 GMT
Show Data? y
-----------------HTTP Response Data-----------------

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    哈哈
</body>
</html>
host:port>
分享到:
评论

相关推荐

    centos搭建安卓模拟器实现自动化抓包分析

    在CentOS上搭建安卓模拟器实现自动化抓包分析是一个多步骤的过程,包括安装必要的软件,创建和配置AVD,安装抓包工具,设置代理,以及编写自动化脚本。这个过程对于安卓开发者和APP接入服务分析人员来说,可以帮助...

    RESTClient-HTTP请求模拟器-HTTP请求测试工具

    它作为一个HTTP请求模拟器,允许用户发送各种HTTP请求(如GET、POST、PUT、DELETE等)并接收响应,以此来验证和调试RESTful API的功能。在本文中,我们将详细探讨RESTClient的特性、使用方法以及其在API测试中的重要...

    骄阳HTTP模拟器

    版本号通常表示软件的迭代,v1.0通常代表第一个正式发布的版本,意味着产品已经具备了基本的稳定性和功能性。 在提供的【压缩包子文件的文件名称列表】中,我们看到"骄阳HTTP模拟器.exe"是主程序文件,用户可以直接...

    HttpServer:模拟实现一个简易版HTTP服务器(通用的HTTP服务器框架)

    模拟实现一个简易版http服务器 HTTP服务器 通过浏览器,发送一个标准的HTTP请求,就能够得到一个标准的HTTP响应。 如果请求的是一个html网页,那么就能在浏览器中看到对应的结果。 实现的功能 能够接收标准的HTTP...

    http文件下载模拟器,模拟文件下载的http服务器

    “HTTP文件下载模拟器”就是基于这一协议,模拟一个基本的HTTP服务器,它能够在本地运行并响应HTTP请求,提供文件下载服务。这种模拟器通常具有简单易用的界面,允许用户上传要提供的文件,并设定相应的HTTP响应信息...

    SECS模拟器SecsSimulator,sans模拟器,C,C++

    SecsSimulator可能是一个模拟了SECS/GEM协议的软件,允许开发者在没有实际设备的情况下验证其通讯逻辑。这种模拟器通常会提供可视化界面,帮助用户配置和理解SECS/GEM交互过程,从而简化配置工作。通过模拟不同的...

    用VNC远程控制android模拟器

    3. **VNC Server for Android Emulator**:可以从[这里](http://code.google.com/p/android-vnc/)下载,这是一个专门为Android模拟器设计的VNC服务器程序。 4. **VNC Viewer**:任何支持VNC协议的客户端都可以作为...

    windows mobile 6.0模拟器使用

    Windows Mobile 6.0 模拟器是一个功能强大的工具,可以模拟企业邮件收发,主要用于测试和开发目的。在本文中,我们将详细介绍如何设置 Windows Mobile 6.0 模拟器来收发企业电子邮件透过移动设备,如 Pocket PC 或是...

    ASP源码—实现的比较精致wap模拟器 v1.0.zip

    这个“ASP源码—实现的比较精致wap模拟器 v1.0.zip”文件似乎包含了一个基于ASP技术构建的WAP(Wireless Application Protocol)模拟器的源代码,版本为1.0。WAP是一种通信协议,它允许移动设备通过无线方式访问...

    夜神模拟器安卓抓包环境搭建

    对于Wireshark,你需要在模拟器上安装一个叫做 tcpdump 的命令行工具,这是Wireshark在安卓设备上抓包的基础。你可以通过命令行或者在模拟器中安装apk来实现。安装完成后,使用命令`adb shell`进入模拟器的命令行...

    基于ASP的实现的比较精致wap模拟器 v1.0.zip

    这个“基于ASP的实现的比较精致wap模拟器 v1.0.zip”压缩包文件,显然包含了一个使用ASP技术构建的WAP(Wireless Application Protocol)模拟器的早期版本。WAP是一种在移动设备上浏览互联网内容的协议,它允许用户...

    Ogame战斗模拟器URL

    根据提供的部分文件内容,“Ogameսģַhttp://websim.speedsim.net/”,这个URL指向了一个外部的战斗模拟器网站。对于Ogame玩家来说,这是一个非常有价值的资源。原因在于: 1. **提高决策效率**:利用模拟器可以...

    逍遥模拟器 版本V9.0.9.0、模拟器、逍遥、安卓、IOS、FiddlerSetup-5.0.20204.45441抓包工具

    模拟器是通过在操作系统层面上创建一个虚拟环境来模拟其他操作系统的行为,使得电脑可以运行非本原生的操作系统和应用程序。逍遥模拟器专注于提供流畅的游戏体验,因此特别受到游戏爱好者的欢迎。对于那些希望在大...

    fiddle连接mumu模拟器到adb连接成功,保姆级

    标题中的“fiddle连接mumu模拟器到adb连接成功,保姆级”意味着这是一个关于如何使用Fiddler工具与Mumu模拟器进行ADB(Android Debug Bridge)连接的教程,旨在为初学者提供详尽的指导。这个过程对于Android应用...

    C#实现Http post方式 服务端+客户端源码

    C#实现Http post方式 服务端+客户端源码,修改成你的ip端口,直接运行可用 【核心代码】 //提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。此类不能被继承。 httpobj = new HttpListener(); //定义url及...

    onvif 前端模拟器

    在进行ONVIF相关的开发时,前端模拟器是一个非常有价值的工具,它能帮助开发者在没有真实硬件设备的情况下进行测试和调试。 "onvif 前端模拟器"是一个专门针对ONVIF协议设计的模拟工具,它可以模拟一台支持ONVIF的...

    最新md模拟器Gens32_Surreal_v1_86_HD.zip

    5. **网络对战功能**:kailleraclient.dll可能是一个网络库,用于实现模拟器的在线多人游戏功能,让玩家可以通过互联网与他人联机对战。 6. **执行文件**:Gens32 Surreal.exe和PowerUp.exe是模拟器的核心执行文件...

    摄像机RTSP流模拟器(win64).zip

    摄像机RTSP流模拟器是一种专门用于测试和开发与实时传输协议(RTSP)相关的应用程序的工具,尤其适用于Windows 64位操作系统。RTSP,全称Real-Time Streaming Protocol,是一种控制媒体流的网络通信协议,常用于视频...

    TR069模拟器2021.rar

    总的来说,"TR069模拟器2021.rar"是一个强大的学习和测试工具,可以帮助IT专业人士深入理解TR069协议的工作原理,提升其在设备远程管理领域的技能。通过实践操作,你可以掌握TR069协议的关键要素,包括协议栈实现、...

    模拟器,网络协议

    综上所述,模拟器在理解和实现网络协议中扮演着至关重要的角色,无论是为了学术研究、教育目的还是企业级应用,都能提供一个安全、灵活且可重复的实验环境,帮助我们深入学习和掌握复杂的网络通信机制。

Global site tag (gtag.js) - Google Analytics