精华内容
下载资源
问答
  • 模拟服务器 建立一个模拟服务器 用法 # 安装依赖 npm install # 先执行npm run dev npm run dev # 再执行npm run gulp # 就可以搭建一个随改随变的 mock - server 环境 # 以后每次当我们需要添加修改mock数据使都不...
  • 模拟服务器 易于使用,没有多余的http模拟服务器。 假设您正在开发与一个或多个API服务对话的前端应用程序。 在开发环境中本地运行时,您需要以某种方式向应用程序提供这些服务:您可以依赖远程部署,在本地启动...
  • MatrikonOPCServer exe 程序的压缩包,工程测试模拟环境搭建需要MatrikonOPCServer 服务端程序,可以配合modscan 程序展示效果
  • GCM CCS / XMPP模拟服务器(Java) GCM CCS Mock服务器是XMPP服务器,用于模拟Google Cloud Messaging(GCM)云连接服务器(CCS)。 它在开发,质量保证和性能测试环境中很有用。 特征 基于Apache Vysper的XMPP...
  • 本地环境模拟建站(无域名空间)

    千人学习 2017-01-16 09:34:46
    本课程的主要目的是没有购买域名和空间的情况下,在本地电脑上学习网站建设技能。课程教你通过本地环境软件模拟服务器环境,完成网站部署。
  • 简单模拟IIS服务器

    千次阅读 2015-12-20 18:51:16
    首先模拟IIS服务器,最基本的就是对浏览器的请求进行处理,并将处理结果返还给浏览器,浏览器在对服务器响应的结果进行解析,并呈现在浏览器中,所以具体步骤如下所示: 1. 编写Socket,用于监听并接受浏览器发过来...

    最近在学习asp.net,在学习这部分之前,我觉得对iis的理解是很重要的,所以记录一下简单模拟IIS的过程和代码。

    一. 模拟IIS流程:
    首先模拟IIS服务器,最基本的就是对浏览器的请求进行处理,并将处理结果返还给浏览器,浏览器在对服务器响应的结果进行解析,并呈现在浏览器中,所以具体步骤如下所示:
    1. 编写Socket,用于监听并接受浏览器发过来的请求,以及向浏览器发送响应内容。
    2. 接受浏览器的请求报文,并进行解析,获取有用的报文信息。
    3. 根据请求报文的信息进行响应,响应时,包括处理响应头和处理响应体。
    3.1 响应头处理
    3.2 响应体处理
    4. 编写响应的网页,进行测试。

    二. 代码和说明
    编写Socket

            private void btnBind_Click(object sender, EventArgs e)
            {
                Socket bindSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtIp.Text.Trim());
                IPEndPoint port = new IPEndPoint(ip, int.Parse(txtPort.Text));
                bindSocket.Bind(port);
                bindSocket.Listen(10);
                lblBind.Text = "正在监听...";
                lblBind.ForeColor = Color.Green;
                //创建线程池进行监听
                ThreadPool.QueueUserWorkItem(new WaitCallback(conSck =>
                {
                    Socket acceptSocket = conSck as Socket;
                    while (true)
                    {
                        Socket recieveSocket = acceptSocket.Accept();
                        byte[] buffer = new byte[1024 * 1024 * 2];
                        int r = recieveSocket.Receive(buffer);
                        string str = Encoding.UTF8.GetString(buffer, 0, r);
                        txtInfo.Text = str;
                        //处理请求后响应
                        ProcessRequest(str, recieveSocket);
                    }
                }),bindSocket);
            }

    这里的ProcessRequest是回发响应数据的函数。
    解析请求报文
    解析请求报文时,为了能更好的管理请求报文和响应报文,我们对这两部分进行了封装,并封装一个上下文类,对其进行管理。即这个上下文HttpContext类相当于一个中转站,它负责向浏览器分发响应体,以及向服务器分发请求体。
    HttpContext:

        class HttpContext
        {
            public HttpContext(string str)
            {
                this.HttpRequest = new HttpRequest(str);
                this.HttpResponse = new HttpResponse(HttpRequest);
            }
    
            public HttpRequest HttpRequest{get;set;}
            public HttpResponse HttpResponse { get; set; }
    
        }

    这样处理请求报文类HttpRequest将请求报文处理好后提交给HttpContext,处理响应体的类就可以从HttpContext获取相应的处理后的请求体了。下面是请求类对请求体的处理。
    HttpRequest:

        class HttpRequest
        {
            private string str;
    
            public HttpRequest(string str)
            {
                string[] strSplit = str.Split(new string[] { "\r\n" }, StringSplitOptions.None);
                string[] strRequest = strSplit[0].Split(' ');
                this.RequestMethod = strRequest[0];
                this.RequestUrl = strRequest[1];
                this.HttpVersion = strRequest[2];
            }
    
            public string RequestMethod { get; set; }
            public string HttpVersion { get; set; }
            public string RequestUrl { get; set; }
        }

    由于浏览器对服务器的请求内容比较多,我们只获取一下请求内容中的请求方法,请求地址,以及请求的http版本号。其实这里只用到了了请求的地址,即浏览器所请求的页面。
    响应处理
    响应类拿到请求类解析后的请求属性后,会对浏览器的请求进行处理(主要是响应体处理,即请求的页面处理),然后将处理结果与响应类的响应头中所必须的属性一起回发给HttpContext,再由Sockt将HttpContext中接受的响应发送给浏览器。那么如果将响应处理的内容写到响应类中会造成程序和层次的混乱,以及降低了程序的维护性。所以这里再封装一个类来对请求内容处理。

    为什么要对请求内容处理呢,因为浏览器请求的页面分为静态页面和动态页面,那么如果是静态页面,我们需要从服务器本地获取到浏览器所请求的页面地址,如果是动态页面,我们需根据请求的URL动态获取.cs等动态页面文件。下面是HttpApplication类,用于处理静态页面和动态页面。
    HttpApplication:

     class HttpApplication 
        {
    
            public void ProcessRequest(HttpContext context)
            {
                string extention=Path.GetExtension(context.HttpRequest.RequestUrl);
                if (extention == ".aspx")
                {
                    HandleDynamicPage(context);
                }
                else
                {
                    HandleStaticPage(context);
                }
            }
    
            private void HandleStaticPage(HttpContext context)
            {
                string namepace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
                string path1 = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
                string path = Path.Combine(path1, "website", context.HttpRequest.RequestUrl.TrimStart('/'));
                if (File.Exists(path))
                {
                    context.HttpResponse.ResponseBody = File.ReadAllBytes(path);
                }
                else
                {
                    context.HttpResponse.ResponseBody = new byte[] { 0 };
                }
            }
    
            private void HandleDynamicPage(HttpContext context)
            {
                string className=Path.GetFileNameWithoutExtension(context.HttpRequest.RequestUrl);
                string ObjectName = MethodBase.GetCurrentMethod().DeclaringType.Namespace + "." + className;
                IDynamicPages dynamicPage =(IDynamicPages) Assembly.GetExecutingAssembly().CreateInstance(ObjectName);
                if (dynamicPage != null)
                {
                    dynamicPage.ProcessRequest(context);
                }
            }

    响应类
    处理完毕后,结合响应类就可以将响应内容回发了。
    HttpResponse:

        class HttpResponse
        {
            private HttpRequest httpRequest;
    
            public HttpRequest HttpRequest
            {
                get { return httpRequest; }
                set { httpRequest = value; }
            }
    
            public HttpResponse(HttpRequest httpRequest)
            {
                this.HttpRequest = httpRequest;
            }
            public byte[] ResponseHeader 
            {
                get 
                {
                    return GetResponseHeader(); 
                }
            }
            public byte[] ResponseBody { get; set; }
            public string ContentLenth
            {
                get
                {
                    if (ResponseBody != null)
                    {
                        return ResponseBody.Length.ToString();
                    }
                    else return string.Empty;
                }
                set { ContentLenth = value; }
            }
            public string ContentType
            {
                get { return GetContentType(HttpRequest.RequestUrl); }
                set { ContentType = value; }
            }
            private byte[] GetResponseHeader()
            {
                 //HTTP/1.1 200 OK
                 //Content-Type: text/html
                 //Content-Length: 913
                StringBuilder strHeader = new StringBuilder();
                strHeader.AppendLine("HTTP/1.1 200 OK");
                strHeader.AppendLine("Content-Type: " + ContentType);
                strHeader.AppendLine("Content-Length: " + ContentLenth);
                strHeader.AppendLine();
                return Encoding.UTF8.GetBytes(strHeader.ToString());
            }
            private string GetContentType(string p)
            {
                string urlExtension = Path.GetExtension(p);
                string content_Type = string.Empty;
                switch (urlExtension)
                {
                    case ".aspx":
                    case ".html":
                    case ".htm":
                        content_Type = "text/html; charset=utf-8";
                        break;
                    case ".png":
                        content_Type = "image/png";
                        break;
                    case ".gif":
                        content_Type = "image/gif";
                        break;
                    case ".jpg":
                    case ".jpeg":
                        content_Type = "image/jpeg";
                        break;
                    case ".css":
                        content_Type = "text/css";
                        break;
                    case ".js":
                        content_Type = "application/x-javascript";
                        break;
                    default:
                        content_Type = "text/plain";
                        break;
                }
                return content_Type;
            }      
        }

    响应类中包括响应头和响应体,为了简单,我们同样只响应一些必要的内容,响应头包括响应是否成功,响应页面类型(html,aspx,css,jpg等),以及响应体字节长度。响应体自然是响应页面的内容了。这里交给了HttpApplication处理了。

    获取动态页面内容
    获取静态页面的内容在HttpApplication中有,我们只需建好相关的页面就可以了。那么怎么处理动态页面呢,这里以.aspx为例,.aspx页面在程序中可以是一个.cs文件,那么我们就要建立相应的.cs文件了。但是建立好了.cs文件,程序怎样获取呢,因为项目中有很多.cs文件,我们怎么判断哪个是相应的.aspx呢,怎样获取相应的类对象呢。这里可以让所有的只要是.aspx的类都继承一个IDynamicPages的接口,并实现接口中的ProcessRequest方法,然后可以通过反射动态页面名称获取相应的类,并将其强转成IDynamicPages类型。这样就获取到了该对象,并执行该对象中的ProcessRequest(用于获取页面内容)方法。下面是.aspx页面类:

        class IndexPage : IDynamicPages
        {
    
            public void ProcessRequest(HttpContext context)
            {
                StringBuilder str = new StringBuilder();
                str.Append("<html><head><title>hello, world</title></head><body><p>hello, world!</p></body></html>");
                context.HttpResponse.ResponseBody = Encoding.UTF8.GetBytes(str.ToString());
            }
        }

    这个类中的ProcessRequest中只写了一个hello, world的html,并将其传给HttpResponse的响应体属性。
    上面HttpApplication类中的HandleDynamicPage方法,就是用于获取请求动态页面所对应的的类对象,并调用该对象中的ProcessRequest方法,从而得到响应体。
    Socket回发响应内容
    这样Socket就可以通过HttpContext获取响应内容,并发送给浏览器了,其余的事情就交给浏览器了.

            private void ProcessRequest(string str, Socket recieveSocket)
            {
                HttpContext context = new HttpContext(str);
                HttpApplication application=new HttpApplication();
                application.ProcessRequest(context);
                recieveSocket.Send(context.HttpResponse.ResponseHeader);
                recieveSocket.Send(context.HttpResponse.ResponseBody);
                recieveSocket.Shutdown(SocketShutdown.Both);
                recieveSocket.Close();
            }

    简单测试
    打开简单的IIS服务器,然后点击里监听,在浏览器中输入http://192.168.1.100:9991/index.htm ,这里192.168.1.100是我本机的ip,9991是端口号,index.html是一个静态网页.
    这里写图片描述
    文本框中的内容就是浏览器的请求内容。
    浏览器显示index.html
    这里写图片描述
    请求一个动态页面:http://192.168.1.100:9991/IndexPage.aspx
    这里写图片描述
    对于简单的页面可以进行测试成功,由于这是一个简单的模拟,主在理解浏览器的请求和服务器的响应方式,所以程序还是有不少需要改进的。

    资源下载地址:http://download.csdn.net/detail/u012058778/9371404

    展开全文
  • 服务器中用户活动驱动的环境寿命模拟 :warning_selector: 这是开发部门。 检出以获取有效版本。 概念 D-Zone是一种图形模拟,旨在抽象地表示Discord服务器中的活动。 这并不意味着要进行任何实际的监视或诊断,而...
  • 利用Nginx模拟搭建服务器集群

    千次阅读 2016-09-22 01:06:11
    利用Nginx模拟搭建服务器集群,形成对数据库集群的初步理解。

    利用Nginx模拟搭建服务器集群之前我们首先应该明白两个概念“Nginx”和“服务器集群”,下面我们详细介绍一下这两个名词的概念。

    Nginx的概念:

    Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。它可以在大多数Unixlike OS 上编译运行,并有Windows移植版,在高连接并发的情况下,Nginx是Apache服务器不错的替代品能够支持高达50,000 个并发连接数的响应。

    服务器集群的概念:

    服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。

    服务器集群跟大多数集群的一样都具有负载均衡和增强系统稳定性的优点。

    了解完Nginx和服务器集群的概念之后,我们开始正式模拟在widows环境下利用Nginx搭建服务器集群的步骤了。

    首先我们需要在电脑上安装两个或者两个以上的tomcat服务器,在这里我以两台服务器为例,安装完两台tomcat之后,我们需要做的是修改tomcat中conf文件夹下的serve.xml的配置文件。

    步骤如下:

    第一步:打开server.xml

    第二步:修改配置文件

    我们修改两个tomcat的配置文件的目的是为了让端口号不冲突,以便于同时运行两个tomcat,修改好两个tomcat的配置文件之后,我们就需要安装Nginx了,在将Nginx的安装包解压之后,我们双击打开nginx.exe,启动之后直接访问http://localhost,打开之后显示如下页面就安装成功了。

    显示成功之后,我们下面要做的就是配置Nginx的文件了,我们打开nginx/conf/nginx.conf文件,配置其中的参数如下:

    配置完成数据之后,我们需要重新启动一下nginx.exe,务必要要关闭掉之前的nginx.exe,否则就会默认之前的数据。也可以在命令提示符窗口使用reload加载。通过以上的配置我们已经可以通过访问“localhost/+项目名称”访问到不同的tomcat来分担服务器端的压力。


    展开全文
  • 【网络模拟】网络环境模拟搭建

    千次阅读 2016-08-08 09:21:03
    原先使用NEWT在Windows端搭建一套网络仿真的环境,现在搭建一套更加精确的网络控制器网络模拟拓扑图其中,网络控制器需要时一个双网卡的服务器,两个网口eth0和eth1网桥的搭建网桥:工作在网络链路层,可以连接不同...

    原先使用NEWT在Windows端搭建一套网络仿真的环境,现在搭建一套更加精确的网络控制器

    网络模拟拓扑图

    这里写图片描述

    其中,网络控制器需要时一个双网卡的服务器,两个网口eth0和eth1

    网桥的搭建

    **网桥:**工作在网络链路层,可以连接不同局域网的网络设备

    网络控制器中网桥的搭建:
    安装网桥搭建工具bridge-utils:
    yum install bridge-utils
    配置网桥:
    brctl addbr br0
    brctl addif br0 eno1
    brctl addif br0 eno2
    ifconfig br0 xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx up

    使用brctool show查看配置是否成功:
    这里写图片描述

    流量控制模块配置

    网桥搭建成功后,现在我们开始流量控制部分

    实现工具:
    linux2.4以上版本的内核中自带了有netem(net emulation)模块和tc(traffic contrl)模块,前者用于网络仿真,后者用于流量整形控制,都是通过tc命令进行配置

    作用:
    在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况

    实现流程:

    这里写图片描述

    配置命令:

    延时

    • 固定延时
    # tc qdisc add dev eno1 root netem delay 100ms
    
    • 波动性的延时:
    tc qdisc change dev eno1 root netem delay 100ms 10ms
    

    将 eno1 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送

    ping 一下153机器:
    这里写图片描述

    • 进一步加强波动性的延时:

    设置相关性为30%:

    tc qdisc change dev eno1 root netem delay 100ms 10ms 30%
    

    抖动

    设置延时抖动为正态分布:

    # tc qdisc change dev eno1 root netem delay 100ms 20ms distribution normal
    

    丢包

    • 固定丢包率:
     # tc qdisc change dev eno1 root netem loss 10%
    

    ping 一下153机器:
    这里写图片描述
    因为ping的时长较短,故丢包率不是很准确

    包重复

    # tc qdisc add dev eno1 root netem duplicate 1%
    

    将 eno1 网卡的传输设置为随机产生 1% 的重复数据包

    包损坏

    # tc qdisc add dev eno1 root netem corrupt 0.2%
    

    将 eno1 网卡的传输设置为随机产生 0.2% 的损坏的数据包(内核版本需在 2.6.16 以上)

    乱序

    • 按照个数
    # tc qdisc change dev eno1 root netem gap 5 delay 10ms
    

    每第5个包马上发送,其他的包间隔10ms发送

    • 按照百分比
    # tc qdisc change dev eno1 root netem delay 10ms reorder 10% 25%
    

    10%的包(相关性为25%)马上发送,其他的包间隔10ms发送

    带宽
    模拟工具:ethtool
    命令:

    –s ethX [speed 10|100|1000] [duplex half|full]  [autoneg on|off] 
    
    • 如设置100M的带宽:
    # ethtool -s eno1 autoneg off speed 100 duplex full
    
    • 使用ethtool eno1 查看网络带宽

    这里写图片描述

    • 查询网口收发包统计
    ethtool –S eno1
    
    • 将ethtool 设置永久保存在网络设备的方法

    ethtool 设置可通过 /etc/sysconfig/network-scripts/ifcfg-ethX 文件保存,从而在设备下次启动时激活选项。
    例如:ethtool -s eno1 speed 100 duplex full autoneg off
    此指令将eno1设备设置为全双工自适应,速度为100Mbs。若要eno1启动时设置这些参数, 修改文件/etc/sysconfig/network-scripts/ifcfg-eno1,添加如下一行:
    ETHTOOL_OPTS=“speed 100 duplex full autoneg off”

    问题1:

    配置OK后出现网络控制器无法连接外网但可ping通局域网,数据接收端可正常连接外网且能ping通局域网的问题,删除网桥后,网络控制器即可访问外网
    是否因为网桥的设置出现问题,尝试删除eno1和eno2网口的ip等信息,尝试将eno1和eno2的ip等设置为手动设置,尝试将linux的防火墙关闭,甚至是重装系统,各种尝试均无解的时候,检测网络控制器ping外网时的路由情况traceroute hostname,发现只是在本地连网关都没到达,网络控制器的gateway没有设置(奇怪的是,在linux右上角网络设置界面设置了gateway是无效的),使用命令

    route -n
    

    可查看路由情况,此时可以使用命令添加默认gateway

    route add default gw 172.18.152.1
    

    网络控制器即可成功的访问外网

    删除gateway后实验一下是否此时是网络控制器无法访问外网,使用命令

    route del default
    
    

    此时网络控制器无法访问外网,说明是没有默认网关引起的问题,但是好奇的是为何数据接收端的主机是可以进行外网访问,eno1是不需要走默认gateway?

    展开全文
  • 模拟服务器MockServer之Moco详细介绍

    万次阅读 2017-01-17 15:05:41
    现在做进一步的介绍,一个模拟我们的服务器的东东–moco 先运行起来 请先下载这个文件moco.jar,接着,在我们的桌面新建一个文件data.json,用记事本打开,粘贴下面的东东 ,具体意思后面介绍 [{ "request" :...

    前面一篇介绍了如何用mockito来测试我们的一些异步任务,例如网络请求时候的异步回调。 
    现在做进一步的介绍,一个模拟我们的服务器的东东–moco

    先运行起来

    请先下载这个文件moco.jar,接着,在我们的桌面新建一个文件data.json,用记事本打开,粘贴下面的东东 ,具体意思后面介绍

    [{ "request" : { "uri" : "/hello" }, "response" : { "text" : "Hello  World !!!" } } ]
    

    保存好,然后打开我们的终端或者CMD。 
    输入下面的命令

    java -jar moco-runner-0.10.2-standalone.jar start -p 5638 -c data.json
    

    我比较简单粗暴,直接把桌面文件拉过去,CMD自动填好地址,所以看到都是Desktop上的。 
    回车,确认后,会有下面的信息

    INFO Server is started at 5638
    INFO Shutdown port is 52384
    

    这里写图片描述

    所以现在,我们打开我们的游览器, 输入

    http://localhost:5638/hello
    

    理论上没有出错,那么返回的就是hello world!!! 
    如下: 
    这里写图片描述

    解释:

    java -jar moco-runner-0.10.2-standalone.jar start -p 5638 -c data.json
    

    这个命令的意思是要mock监听本地的5638端口,对应的请求返回的数据在我们的data.json里面。 
    当有网络请求到来的时候,我们的mock就会去查data.json,把requesthello对应的数据返回, 
    我们写的是 Hello World !!!,所以游览器返回这个。

    如果没有这个请求,就返回空。

    如果要添加新的请求的,可以这样写

    [{"request":{ "uri": "/hello"}, "response" : { "text": "Hello World" }}  ,
     {"request":{ "uri": "/go"}, "response": { "text" : "go away !!!" }}  ]
    

    加个逗号接着复制多一份,改下请求的uri。ok,就这样,是不是很简单的感觉?? 
    那么更复杂的请求怎么办呢?例如有post数据的情况。

    复杂的请求

    显然我们的请求确实可能这么简单,最少都是带参数的,例如要获取jack用户信息,请求像下面这样

    http://localhost:5638/user/getUser?name=jack
    

    那么我们的数据该怎么写呢?

    { 
     "request" : { 
        "uri" : "/user/getUser",
         "queries": { "name":"jack" } 
      },
      "response" : {
           "text" : "Hey. I'm jack" 
         }  
    }
    

    正则表达式

    对于rest风格的url,Moco支持正则匹配。

    { 
      "request": { 
           "uri": { 
           "match": "/getUser/\\w+" } 
        },
      "response": {
           "text": "Find a boy."
       } 
    }
    

    POST , GET , PUT , DELETE 等方法

    除了Get外,Post,Put,Delete等请求模式自然是支持的,格式如下,加多methodForms参数

    {
      "request" :{
          "method" : "post",
           "uri": "/getUser",
          "forms" :{
              "name" : "jack"
           }
        },
      "response" : {
          "text" : "Hi. you get jack data"
        }
    } 
    

    我们用postman来做模拟,返回数据正确!

    这里写图片描述

    Headers , Cookies , StatusCode

    这个是支持特定的头的和cookies是支持的,我们需要加的就是headerscookies 和status属性,参考如下

    {
      "request" :{
          "method" : "post",
          "headers" : {
            "content-type" : "application/json"
          }
        },
      "response" :{
          "status" : 200,
          "text" : "bar",
           "cookies" :{
              "login" : "true"
          },
           "headers" :{
              "content-type" : "application/json"
           }
        }
    }
    

    Json

    我们对返回的数据,可以定义为Json的,格式如下

    {
          "request" :{
                  "uri": "/getJson",
                  "method" : "post",                  
           },
          "response" :{
              "status" : 200,
               "headers" :{
                  "content-type" : "application/json"
               },
              "json": {
                    "foo": "bar"
                   }               
          }
    }
    

    重定向

    介绍一个redirect

    { 
      "request" : { "uri" : "/redirect" }, 
      "redirectTo" : "http://www.XXX.com" 
      }
    

    延迟

    我觉得这个还是个重要的属性,因为移动手机的网络环境很复杂,高RTT不是盖的,网络延迟个几十秒的那也是正常的,所以我们需要一个latency

    {
      "request" :{
          "text" : "foo"
        },
      "response" :{
          "latency": {
              "duration": 1,
              "unit": "second"
            }
        }
    }
    

    template

    上面的请求参数的值和返回值都是固定的,这自然太过死板。 
    好在从0.8版本开始,Moco提供了template功能,可以动态的返回一些参数值,虽然是beta版本。

    例如:

      {
        "request": {
            "uri": "/getUser2"
            },
        "response": {
              "text": {
                 "template": "${req.queries['name']}"
                     }
            }
     }
    

    这样,但当我们的请求是localhost:5638/getUser2?name=nameIsJack,那么返回的数据是nameIsJack

    这里写图片描述

    。。。。这个CSDN真是,写一半就又崩溃了。传图片又不可以,高可用的服务器啊。

    除了上面的,还有

    "template": "${req.version}"
    "template": "${req.method}"
    "template": "${req.content}"
    "template": "${req.headers['foo']}"
    "template": "${req.queries['foo']}"
    "template": "${req.forms['foo']}"
    "template": "${req.cookies['foo']}"
    

    这些方法上面都用过了,就不一 一解释了。

    Event事件

    从0.9版本开始,mock提供了event方法,什么意思呢 
    有时候,我们请求一些特定接口的时候,我们可能需要去请求别的地址,从而才能完成请求。 
    例如OAuth等,牵涉到第三方的情况。这时候,Event就派上大用场了

     {
        "request": {
            "uri" : "/event"
        },
        "response": {
            "text": "event"
        },
        "on": {
            "complete": {
                "get" : {
                    "url" : "http://another_site/OAuth?xxx=xxxx"
                }
            }
        }
    }
    

    这样我们就可以等去验证完权限部分,才返回结果。

    异步请求 Asynchronous

    前面的请求默认都是同步的,这意味着只有等到服务器处理完,结果才会返回给客户端 
    如果你的实际情况不是这样,需要来点异步的,那么从0.9版本开始,有这个功能了,另外你还可以延迟个5秒,像这样

    {
            "request": {
                "uri" : "/event"
            },
            "response": {
                "text": "event"
            },
            "on": {
                "complete": {
                "async" : "true",
                "latency" : 5000,
                    "post" : {
                        "url" : "http://www.baidu.com",
                        "content": "content"
                    }
                }
            }
        }
    

    分模块

    我们的请求很显然是有很多的,例如有u 
    ser模块的userApi业务,聊天模块的chatApi业务等等, 
    如果把这些不同的模块的业务都写在一个文件里面,那就太难看了,为此,需要一些明智点的解决方案 
    下面以一个TodoList的作为介绍

    [ { "context": "/user", "include": "user.json" }, { "context": "/todo", "include": "todo.json" } ]
    

    这样,当我们访问 
    http://localhost:12306/user/create 和 http://localhost:12306/todo/getAll时候, 
    会跳到后面对应的json再处理一遍

    //user
    [ { "request" : { "uri" : "/create" }, "response" : { "text" : "这是创建用户请求" } } ]
    //todo
    [ { "request" : { "uri" : "/getAll" }, "response" : { "text" : "这是获取用户所有Todo的请求" } } ]
    

    Moco支持在全局的配置文件中引入其他配置文件,这样就可以分服务定义配置文件,便于管理。 
    配置好文件,在全局文件中引入即可: 
    全局配置如下:

    java -jar moco-runner-standalone.jar start -p 5638 -g data.json
    

    注意,此时需要通过参数 -g 在加载全局配置文件。,使用的不是-c

    否则配置文件解析会报错。

    展开全文
  • 大数据服务器环境配置

    千次阅读 2018-04-25 12:30:55
    大数据服务器环境配置前言:本人萌新,最近买了3台云服务器便想自己搭建一个大数据的环境。因为是试手服务器,加上是学生党没什么钱呀~所以配置没买太高。本人选择了3台1核2G的服务器。 1. 操作系统选择因为是云...
  • DNS 截持模拟环境搭建

    千次阅读 2016-05-03 18:50:29
    这里的 DNS 服务器是配置在主机 172.16.2.51 上的,DNS 服务器上针对 www.baidu.com ...另外有两台 Android 机连接到此 DNS 服务器。第一台直接与此 DNS 服务器进行交互,第二台通过第一台共享的热点与 DNS 进行交互。
  • 微信公众帐号API接口开发模拟环境模拟微信平台向开发者发送的数据,让微信开发测试变得更加简单。使用ajax将xml发送到服务器,不过只模拟了文字信息和关注信息。
  • 构建手机模拟环境

    千次阅读 2018-11-10 03:56:06
    构建手机模拟环境
  • eNSP模拟简单网络环境

    千次阅读 2019-07-31 14:58:10
    eNSP模拟简单网络环境 实验环境 用ensp搭建图中拓扑,其中cloud1所在的网络为vmnet1,VMware Workstation中开启一台windows7计算机,网络桥接在VMnet1,IP地址配置为192.168.1.40/24.其他设备配置的地址参数拓扑图中...
  • 现在做进一步的介绍,一个模拟我们的服务器的东东–moco先运行起来请先下载这个文件moco.jar,接着,在我们的桌面新建一个文件data.json,用记事本打开,粘贴下面的东东 ,具体意思后面介绍[{ "request" : { "uri" :...
  • 要启动模拟服务器: mocklocal 在单独的终端中,您可以尝试此示例请求 curl localhost:3000/example/mock/ -d '{"test":"1"}' -H "Content-Type: application/json" 构型 所有这些选项都可以通过环境变量进行配置 ...
  • MacBook搭建服务器环境

    千次阅读 2017-09-15 10:08:40
    通过finder的前往文件夹命令,输入/Library/WebServer/Documents可直接看到本地服务器中的文件。 5.修改本地服务器路径 先创建一个文件夹作为要修改的路径 cd ~ mkdir ~/site cd site pwd //得到...
  • 用于PHP的HTTP Mock在PHP单元测试中,模拟服务器端的HTTP请求。 PHP的HTTP Mock模拟HTTP请求的服务器端,以允许与HTTP端进行集成测试。 它使用PHP的内置Web服务器t HTTP Mock进行PHP模拟,在PHP单元测试中,服务器端...
  • 记录对CARLA模拟环境的使用

    千次阅读 2019-03-07 17:49:59
    记录对CARLA模拟环境的使用 CARLA模拟器分客户端与服务器端,目前我使用的是V0.9.3版本,最近新出了0.9,4版本。这里有下载链接和一些教程:(https://carla.readthedocs.io/en/latest/getting_started/) 使用时先建立...
  • HTTP服务器模拟(原创)

    千次阅读 2010-03-17 21:07:00
    昨天模拟了下HTTP客户端,可能很多人会说...我要实现的结果是:用IE浏览器访问我模拟的HTTP服务器,并获得我所请求的页面。好,记下现在的时间:12:43分,我要开始了!  到下午的时候我完成了简单的服务器模型。可以
  • 搭建SVN服务器环境 适应于初学者进行模拟练习
  • 这个 PHP 库将允许您模拟不同的 PHP 服务器配置。 在 CLI 环境中(例如运行 PHPUnit),测试使用某些 $_SERVER 值的类可能会遇到一些困难。 例如,该全局变量不包含与在 Apache 环境中调用脚本相同的内容。 此外,$...
  • 微信本地模拟开发环境搭建

    千次阅读 2019-06-03 21:01:52
    目的是为了模拟微信客户端在发送请求时,既可以请求到微信服务器,也可以通过域名请求到本地的服务。 在Web服务器中监听指定的443端口(https)或者80端口。对于使用Nginx下的443端口需要配置对应的公私钥,nginx....
  • C#模拟IIS服务器(HTML GET POST )

    热门讨论 2010-12-12 23:55:44
    目的: 模拟IIS服务器 当前: 测试模块效果 测试环境:Visual Studio 2005 C# ; .NET Framework 2.0 ; windows 7 用途: 建立简单C/B/S模式转输数据. 优点: 采用HTTP方式(方式:POST GET) ,简单,实用. GET方式时,访问未...
  • 搭建本地Java服务器环境

    千次阅读 2015-05-29 15:13:37
    后端同事出走后,需要在本地搭建java后端服务器环境,特记录以备忘 *** 安装mysql  - Mac 下自带了mysql  - 配置一下.bash_profile 方便调用  - 给一下权限 : "grant all privileges on *.* to 'root'@'...
  • 集合是一组请求,可以作为一系列请求一起运行,以对应相应的环境。 当我们想要自动化API测试时,运行集合非常有用。 运行集合时,会一个接一个地发送集合中的所有请求。 使用脚本时,我们可以构建集成测试套件,在...
  • 一步一步搭建 PHP 服务器环境

    千次阅读 2017-09-21 23:14:00
    这两天翻了翻之前的技术文档,发现有一篇值得拿出来和大家分享:如何给一台全新的阿里云服务器,搭建环境 —— 来部署 PHP 项目,Node.js 项目等。 让我们开始吧: 1. 利用 Docker 制作 Centos 服务器 2. 安装 Nginx...
  • 利用Dummynet模拟恶劣网络环境

    千次阅读 2015-07-14 10:49:37
    利用Dummynet模拟恶劣网络环境在之前的文章中提到了三种模拟恶劣网络环境调试代码的手段: 应用层或者传输层的代理服务器 传输层或者网络层控制数据包的驱动 网络层控制数据包的网关 同时在之前的文章中介绍了第一种...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 182,835
精华内容 73,134
关键字:

模拟服务器环境