如何利用websocket 外网访问进行HTTP访问

loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写 -
- ITeye博客
博客分类:
先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西。比较久之前很简单的用过,最近又用到了,熟悉一下。现做一个总结。
使用loadrunner进行压力测试主要分两步,第一步是编写脚本(比较重点),第二步执行测试(配置都是在界面上点点就行了,当然我只的是比较简单的,能满足日常需要的),第三步分析结果(这一步比较高深,但是对于我来说能看懂简单的性能指标就OK了)。所以这里就说一下脚本的编写,给未来再用到做参考。
1.HTTP的GET请求
这里以访问百度为例,地址/s?wd=mobile,表示在百度上搜索mobile。具体脚本如下(有注释)
lr_start_transaction("send");
web_reg_find("Search=Body",//这里说明在Body的范围内查找
"SaveCount=ret_Count",//这里表示把返回值的个数放在变量ret_Count里
"Text=mobile",//这里表示查找的内容是“mobile”
status=web_url("Baidu_Search",
"URL= /s?wd=mobile",
"TargetFrame=Main",
"Resource=0",
"RecContentType=text/html",
"Mode=http",
lr_output_message("Request Status:%d",status);
lr_output_message("查找到的返回值个数:%d",atoi(lr_eval_string("{ret_Count}")));
if (atoi(lr_eval_string("{ret_Count}")) & 0){//这里判断检查到的个数
lr_output_message("Rec successful.");
lr_end_transaction("send", LR_PASS);
lr_error_message("Rec failed");
lr_end_transaction("send", LR_FAIL);
2.HTTP POST请求
这个是在我们项目中用到的,发送POST请求,进行自然语言识别的,脚本如下:
lr_start_transaction("send");
web_reg_find("Search=Body",//这里说明在Body的范围内查找
"SaveCount=ret_Count",//这里表示把返回值的个数放在变量ret_Count里
"Text=t",//这里表示查找的内容是“t”
status=web_submit_data("trs",
"Action=http://192.168.77.185:9002/recognizeText",//地址
"Method=POST",//POST请求
"RecContentType=text/html",
"Mode=HTML",
"Name=usercontent","Value=gprs",ENDITEM,//这一行表示传入一个参数usercontent,值为gprs
"Name=Accept","Value=text/plain",ENDITEM,
lr_output_message("Request Status:%d",status);
if (atoi(lr_eval_string("{ret_Count}")) & 0){//这里判断检查到的个数
lr_output_message("Rec successful.");
lr_end_transaction("send", LR_PASS);
lr_error_message("Rec failed");
lr_end_transaction("send", LR_FAIL);
3.WebService请求
webservice请求的脚本建议通过可视化的方式添加
1)引入webservice,注意wsdl后缀
2)给入参填值
3)给返回值指定存储到的变量中
4)结果检查
这个与其它模式一样,不多说了
我这里添加的是网上公用的天气预报webservice,地址是:.cn/WebServices/WeatherWebService.asmx
详细脚本如下:
lr_start_transaction("send");
status=web_service_call( "StepName=getSupportCity_102",
"SOAPMethod=WeatherWebService|WeatherWebServiceSoap|getSupportCity",//这里是我已经引用了webservice的名称及调用方法
"ResponseParam=response",
"Service=WeatherWebService",
"ExpectedResponse=SoapResult",
"Snapshot=t.inf",
BEGIN_ARGUMENTS,
"byProvinceName=安徽",//这里是入参,参数名称:byProvinceName,值:安徽。入参和返回值的名称都可以再引用里看见
END_ARGUMENTS,
BEGIN_RESULT,
"getSupportCityResult=result",//这里是返回值,名称:getSupportCityResult,把它放到变量result中
END_RESULT,
lr_output_message("Request Status:%d",status);
lr_output_message("Result:%s",lr_eval_string("{result}"));//这里把返回值输出,调试webservice的时候用
if(strstr(lr_eval_string("{result}"),"合肥")&0){//这里是判断返回值中是否包含“合肥”
lr_end_transaction("send",LR_PASS);
lr_end_transaction("send",LR_AUTO);
4.Socket请求
我这里指的是简单的Socket请求,端连接,发送接收的都是一个字符串。比较复杂的Socket请求,自己录制脚本。如果不知道,自己去查。
详细脚本如下,另外还包含一个data.ws文件,用来声明发送和接收的字节数组及其长度的,并指定要发送的内容(发送的内容一样可以参数化的)
#include "lrs.h"
int recvlen=0;
lrs_startup(257);
lr_start_transaction("Trans_1");
lr_start_transaction("Conn_1");
rc=lrs_create_socket("socket0", "TCP", "RemoteHost=192.168.1.101:8888",
LrsLastArg);//创建Socket连接
if (rc != 0 ) {
lr_end_transaction("Conn_1", LR_FAIL);
lr_end_transaction ("Trans_1", LR_FAIL);
lr_end_transaction("Conn_1", LR_PASS);
//判断socket是否链接成功的事务,0表示创建成功
lrs_send("socket0", "buf0", LrsLastArg); //发送buf0,buf0为在data.ws中定义的发送变量
lrs_receive("socket0", "buf1", LrsLastArg); //接收消息,存放在buf1中,buf1是在data.ws中定义的接收数组,注意数组长度一定要大于等于实际接收长度
lrs_get_last_received_buffer("socket0",&recvbuf,&recvlen);//把Socket最后接收的字节数组,长度放在recvlen中,内容放在recvbuf中
lr_output_message("Received:%s",lr_eval_string(recvbuf));
if(recvlen&3)
lr_end_transaction("Trans_1", LR_PASS);
lr_end_transaction ("Trans_1", LR_FAIL);
lrs_disable_socket("socket0", DISABLE_SEND_RECV);
lrs_close_socket("socket0");
;WSRData 2 1
"hehehehe"
结束的话:
这里介绍的测试脚本,我觉得开发测试人员都需要会,因为开发弄出来的东西,自己要了解个大概的性能吧。如果测试的专业人员,这些都要熟知,再如果想要了解的更多,请转到51testing上去。
浏览 46023
浏览: 469507 次
推荐聚合数据上一些免费API接口https://www.juh ...
请问楼主,为什么我在测试的时候,会收到2次请求?
之前看到一个,应该也是灵图的,blo ...
不错不错!但现在第三方平台上各种API接口很多,就像聚合数据h ...问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
1.能不能先说一说2.再给个demo
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
tcp 传输层协议http 应用层协议socket 区分来自不同应用进程或网络连接的通信。实现数据传输的并发服务。
区别 http是请求-响应的方式 socket 服务器监听 客户端请求 建立连接。也就是socket中服务器可以直接发数据给客户端,而http的话只能等客户端连接上看看服务器有没有可以更新的数据。iOS发送http请求get 或者 post,原生的可以用NSURLConnection 或者iOS7出来的NSURLSession 不过一般都用第三方AFNetworingsocket一般做及时通讯会用到。苹果原生的socket比较难用 可以用asynsSocket。demo的话Github随便搜一个就是了。
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:1077人阅读
网络通信编程(18)
C/C++(38)
平常我们要访问某个
一般都是通过浏览器进行:提交一个
请求后,浏览器将请求发向目标服务器或者代理服务器,目标服务器或者代理服务器返回我们所需要的数据,浏览器接收到这些数据后保存成文件并进行显示。
下面我们看看如何自己利用
winsock2.h
中的接口来实现这个功能?为了简化问题,作以下假设:
通过代理服务器进行
访问,这样就省去了对
解析的步骤,假设代理服务器的地址为:
192.168.0.1
这个功能由以下几个部分组成:
如何建立连接?
如何发送请求?
如何接收数据?
如何判断数据接收完成?
下面我们依次来看下这些问题如何解决?
如何建立与服务器之间的连接
,所以我们需要与服务器建立连接,然后才能发送数据。
建立连接参考如下函数
socket_open
打开Socket,返回socketId,-1表示失败
socket_open(int
SOCKET socketId;
sockaddr_in serv_
&socketId=socket(AF_INET,SOCK_STREAM,0);
)socketId&0)
&&&&&& printf(&[ERROR]Create a socket failed!/n&
&&&&&& return
&memset(&serv_addr,0,sizeof
(serv_addr));
&serv_addr.sin_family=AF_INET;
&serv_addr.sin_addr.s_addr = ntohl(IP);
&serv_addr.sin_port = htons((USHORT)Port);
&status=connect(socketId,(struct
sockaddr*)&serv_addr,sizeof
(serv_addr));
(status!=0)
&&& printf(&[ERROR]Connecting failed!/n&
&&& closesocket(socketId);
&&& return
调用方式如下:
socketId=socket_open(
0xC0A); //0xC0A80001
是192.168.0.1的十六进制写法。
如何发送请求
发送数据要根据
协议的要求附加协议头:
* protocolHead=&GET /index.html HTTP/1.1/n&
&&&& &Accept:
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/x-shockwave-flash, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, */*/n&
&&&& &Accept-Language: zh-cn/n&
&&&& &User-Agent:iPanelBrowser/2.0/n&
&&&& &Host: :80/n&
&&&& &Connection: close/n/n&
这里使用GET来获取指定URL的指定文档。
建立连接后使用send将这些数据发送出去:
&&&& send(socketId, protocolHead,strlen(protocolHead),0);
发送完成HTTP请求后就等待接收数据。
如何接收数据
循环查询的方式来判断有无数据到来:
timeval tm = {0,7};
&&&& fd_set fds_r;
&&&& char recvBuf[4096]={
&&&& FD_ZERO(&fds_r);
&&&& FD_SET(socketId,&fds_r);
status=select(socketId+ 1, &fds_r, 0, 0, &tm); //socketId
在这里是最大的fd
(status & 0 && FD_ISSET(socketId, &fds_r))
&&&&&&&& printf(&Socket is readable...fd=[%d]/n&
,socketId);
&&&& &&&& recv(socketId,recvBuf,4096,0);
这样数据包就保存到缓冲区中了。
如何判断数据接收完成
首先对返回数据的状态进行判断,仅当状态为&
HTTP 200 OK
&时才表明正确返回,这时才对数据进行解析并保存,如果状态为
HTTP 404 NOT FOUND
或者其它状态则表明没有找到资源或者出现其它问题,可参考
当数据正确返回时,为了将实际数据从协议中分离出来进行保存,需要对
数据包进行解析得到
Content-Length
,然后在包含
Content-Length
的当前数据包或者随后的数据包中查找第一个空行,这就是内容(
)的开始位置,再配合前面解析得到的
Content-Length
,就能够知道什么时候数据接收完成了。换行符为&
&,也兼容&
&,设换行符为
,则空行如果位于内容中间或结尾则可查找&
&,若位于开头,则查找
基本就是上面这些,这四个问题解决了,那么整个问题也就解决了!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:243054次
积分:2987
积分:2987
排名:第12055名
原创:51篇
转载:106篇
评论:38条
(3)(2)(21)(11)(3)(10)(4)(7)(1)(5)(9)(20)(1)(4)(6)(2)(6)(11)(30)(1)http原理浅谈:使用socket实现最简单的http大框架 - 简书
http原理浅谈:使用socket实现最简单的http大框架
现在市面上有许多流行的http框架,其实到底层还是利用了socket。大家都学过TCP/IP的四层协议吧。其实http属于应用层,而socket则在网络层。所以http最后肯定要调用socket的。哈哈哈
TCP/IP.png
。下面例子展示了最简单的http框架,看http是怎么调用到socket的。
package com.example.
import android.os.B
import android.support.v7.app.AppCompatA
import android.util.L
import android.view.V
import android.widget.B
import android.widget.TextV
import java.io.BufferedR
import java.io.OutputStreamW
import java.net.InetA
import java.net.S
import java.io.BufferedW
import java.io.InputStreamR
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextV
private static
final String TAG ="wenfeng";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getbt=(Button)findViewById(R.id.Getbt);
resulttv=(TextView)findViewById(R.id.Result);
getbt.setOnClickListener(this);
public void onClick(View v) {
mclient=new Lihttpclent("");
String response=mclient.excute();
resulttv.setText(response);
class Lihttpclent{
private StringBuilder mbuild = new StringBuilder("");
public Lihttpclent(String site){
this.innersite=
public String excute() {
Thread getthread = new Thread(new Runnable() {
public void run() {
Log.i(TAG,"start run");
Socket mSocket=new Socket(
InetAddress.getByName(innersite),
BufferedReader
br = new BufferedReader(new
InputStreamReader(
mSocket.getInputStream(),"utf-8"));
BufferedWriter bf = new BufferedWriter((new OutputStreamWriter(
mSocket.getOutputStream())));
StringBuffer requestHeader = new StringBuffer();
requestHeader
.append("GET " + "/"
+ " HTTP/1.1\n")
.append("HOST:" + innersite + "\n")
//.append("Accept:text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8\n")
.append("Accept-Encoding:gzip, deflate, sdch\n")
.append("Accept-Language:zh-CN,q=0.8\n")
.append("Cache-Control:no-cache\n")
.append("User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36\n")
.append("Encoding:UTF-8\n")
.append("Connection:keep-alive" + "\n")
.append("\n");
bf.write(requestHeader.toString());
bf.flush();
String line = "";
Log.i(TAG,"start read response");
while((line=br.readLine())!=null)
mbuild.append(line);
mbuild.append("\r\n");
Log.i(TAG,mbuild.toString());
}catch (Exception e){
Log.i(TAG,"excetion = "+e.toString());
getthread.start();
getthread.join();
} catch (InterruptedException e) {
e.printStackTrace();
Log.i(TAG,"outbuilder="+mbuild.toString());
return mbuild.toString();
一般的框架给程序员的接口都很简单,输入参数一般是个网址就可以了,上面的例子也是这样,上面例子的框架类是Lihttpclent,为了简单说明原理,输入参数就一个String类型的网址,是不是很简单呢?
mclient=new Lihttpclent("");
String response=mclient.excute();
他是怎么跟socket联系在一起的呢?1.socket构建需要ip地址和端口,所以可以通过InetAddress将网址转换为ip,端口写死80就好。
Socket mSocket=new Socket(
InetAddress.getByName(innersite),
2.那现在socket通道构建起来,该给服务器发些啥呢?那就参照http协议罗,协议要啥就发啥,发一个符合http协议的字符串过去就行了,信息包含编码,缓存,语言等,那服务器就会响应你了。
StringBuffer requestHeader = new StringBuffer();
requestHeader
.append("GET " + "/"
+ " HTTP/1.1\n")
.append("HOST:" + innersite + "\n")
.append("Accept:text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8\n")
.append("Accept-Encoding:gzip, deflate, sdch\n")
.append("Accept-Language:zh-CN,q=0.8\n")
.append("Cache-Control:no-cache\n")
.append("User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36\n")
.append("Encoding:UTF-8\n")
.append("Connection:keep-alive" + "\n")
.append("\n");
3.开启一个线程跟服务器通信,然后获取服务器的响应,将响应的字符串显示在界面
public void onClick(View v) {
mclient=new Lihttpclent("");
String response=mclient.excute();
resulttv.setText(response);
点击get按钮后,等待一下,界面上显示如下
返回值.jpg
例子的源码路径是下面链接,大家可以体会下,其实http框架的基本原理就是这样。当然缓存机制,连接池机制等都是修饰这个大框架的,而衡量框架是否优秀就是看这些修饰了O(∩_∩)O~~。
OPPO系统工程师使用socket模拟http长连接 - ITeye问答
这段代码希望使用socket模拟http长连接。问题一:使用浏览器访问http://localhost:8080的时候发现无法使用 os.write("IOServer \r\n\r\n".getBytes());
返回信息,但可以使用 os.write(buf);
问题二:多次使用浏览器访问后出现io流被关闭的问题,应该是没有返回信息告诉浏览器保持长连接请各位指点
import java.io.InputS
import java.io.OutputS
import java.net.ServerS
import java.net.S
public class IOServer {
public static void main(String[] args) {
ServerSocket serverSocket = new ServerSocket(8080);
boolean stop =
Socket socket = serverSocket.accept();
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
int count = 0;
byte[] buf = new byte[1024];
while(true){
is.read(buf);
System.out.println(new String(buf));
System.out.println("count :"+count);
//os.write(buf);
os.write("IOServer \r\n\r\n".getBytes());
os.flush();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
目前还没有答案
已解决问题
未解决问题

我要回帖

更多关于 socket访问网页 的文章

 

随机推荐