[email protected]   15826058953
B2B外贸网站建设与运营,WEB服务器运维,始于2016。

PHP模拟终端浏览器向服务器以socket方式发送报文

2020-07-05     网络    

本程序目的是使用PHP程序模拟终端设备(主旨浏览器,比如Chrome,Firefox等)向服务器发送报文测试,以下是测试效果图,

浏览器打印的内容在普通情况开发时,浏览器中是看不到的,我们可以通过浏览器的调试信息看得到,登录Chrome以及Edge浏览器按F12后,再点击Network即可看到如下图类似内容的信息:

以下是模拟客户端的源码,client.php:

//创建sock连接
/*
	fsockopen  ( string $hostname  [, int $port  = -1  [, int &$errno  [, string &$errstr  [, float $timeout  = ini_get("default_socket_timeout")  ]]]] )
	hostname:如果安装了OpenSSL,那么你也许应该在你的主机名地址前面添加访问协议ssl://或者是tls://,从而可以使用基于TCP/IP协议的SSL或者TLS的客户端连接到远程主机。 
	port:端口号。如果对该参数传一个-1,则表示不使用端口,例如unix://。 
	errno:如果errno的返回值为0,而且这个函数的返回值为 FALSE ,那么这表明该错误发生在套接字连接(connect())调用之前,导致连接失败的原因最大的可能是初始化套接字的时候发生了错误。 
	errstr:错误信息将以字符串的信息返回。 
	timeout:设置连接的时限,单位为秒。
 */
$fskp = fsockopen('localhost', 80, $errno, $errstr, 10);

//检测请求是否成功
if(!$fskp) {
	echo $errstr;die;	//如果不成功则打印出错误信息,并终止程序。
}


//请求报文:请求行,请求头,请求体
//这里使用GET请求,也可以使用POST请求,请求的server.php为服务器的绝对路径,HTTP/1.1为协议版本
$http = "GET /tempwww/server.php?username=zhangsan&password=123456 HTTP/1.1\r\n";

//请求头信息
$http .= "Host: localhost\r\n";					//连接地址,因为测试是在本地环境测试
$http .= "Connection: close\r\n\r\n";				//连接后要关闭
$http .= "x-requested-with:XMLHttpRequest\r\n";			//设置为同步请求
$http .= "Accept-Language: zh-cn,zh\r\n";			//请求语言为简体中文
$http .= "Referer: http://localhost/tempwww/client.php\r\n";	//请求来源地址
$http .= "Accept: /\r\n";					//限制格式,这里不作任何限制
$http .= "User-Agent: Firefox-Chrome-Safari-Edge-Via\r\n";	//用户终端版本
$http .= "Content-Type: application/x-www-form-urlencoded\r\n";	//请求的类型信息,这里表示为表单的提交数据的格式
$http .= "Content-length: 33\r\n\r\n";				//请求内容的长度

//请求体  无


//向服务器发送请求
fwrite($fskp, $http);

//获取结果
$result = '';
while(!feof($fskp)) {			//循环读取请求结果值
	$result .= fgets($fskp);
}

//输出服务器响应的内容
echo $result;

以下是模拟服务器返回结果的代码,server.php:

echo '

Hello PHP

'; //模板服务器输出信息 //打印$_POST:只输出POST请求的值 //var_dump($_POST); //打印Cookie内容:只输出Cookie值 // var_dump($_COOKIE); //打印Server的内容 // var_dump($_SERVER); //打印$_GET:只输出GET请求的值 var_dump($_GET); //打印$GLOBALS:全局值 //var_dump($GLOBALS);