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);