Heim  >  Artikel  >  php教程  >  PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息,telnetfsockopen

PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息,telnetfsockopen

WBOY
WBOYOriginal
2016-06-13 08:52:15958Durchsuche

PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息,telnetfsockopen

了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器。Windows内置命令Telnet可以帮助我们发送简单的HTTP请求。

并且TELNET是一个特别灵活的工具,我们还可以用它进行FTP/SMTP/POP3/TCP等方式的简单请求。

通过开始菜单--运行--CMD命令进入DOS状态,

我们输入“Telnet 主机地址 端口(Telnet 192.168.1.99 80)” 来进入telnet命令状态(完全黑窗口,此时输出字符会出问题),我们按”ctrl”+”]”,切回普通CMD窗口,再按”ENTER”回车键进入编辑命令状态。

如果系统提示找不到TELNET命令,只需按如下方式可解锁TELNET命令。

进入TELNET 命令输入模式后我们就可以直接编辑头文件来进行发送了

只需要注意:当编辑完请求头文件后要按两次回车键来发送。

这是一次标准的HTTP请求与响应,是不是跟上节的HTTP文件关联了。

当然我们不能只用这么不方便的工具,下面要介绍的是PHP里的fsockopen()方法。

先来看fsockopen()方法的原型:

<p>resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )</p>

它返回一个资源类型的结果,需要传入的参数分别是:

$hostname:主机名

$port:端口号

$errno:错误号(注意原型中的"&"一旦连接有错误,错误号将会被赋值给$errno)

$errstr:错误字符串(一旦连接有错误,错误信息将会被赋值给$errstr)

$timeout:超时时间

<span>$host</span>=<span>parse_url</span>(<span>$url</span>,PHP_URL_HOST);<span>//</span><span>获取host数据</span>

<span>$port</span>=<span>parse_url</span>(<span>$url</span>,PHP_URL_PORT)==<span>null</span> ? 80 : <span>parse_url</span>(<span>$url</span>,PHP_URL_PORT);<span>//</span><span>获取端口数据,如果没有设置则默认为80</span>

<span>$path</span>=<span>parse_url</span>(<span>$url</span>,PHP_URL_PATH);<span>//</span><span>获取到path信息后面使用</span>

<span>$socket</span>=<span>fsockopen</span>(<span>$host</span>,<span>$port</span>,<span>$errno</span>,<span>$errstr</span>,20);//获取资源类型$socket

这个资源类型就如同Telnet里我们用telnet 主机名 端口号 命令之后的环境。

那么接下来,我们就要往这个环境里写内容了。

我们可以分次用fwrite()方法写入头信息,也可以将头信息进行拼合一次写入。

<span>fwrite</span>(<span>$socket</span>, "POST ".<span>$path</span>." HTTP/1.1\r\n"<span>);    

</span><span>fwrite</span>(<span>$socket</span>, "HOST: localhost\r\n\r\n");

或先拼合再写入的方式:

<span>$str</span>="POST ".<span>$path</span>." HTTP/1.1\r\n"."HOST: localhost\r\n\r\n"<span>;

</span><span>fwrite</span>(<span>$socket</span>,<span>$str</span>);

注意:请求行、报头之间有一次回车键,我们用"\r\n"来进行回车输入,结束输入时两用"\r\n\r\n"模拟两次回车。

接下来我们用fread来读取响应信息并将其存入$info中:

<span>while</span> (!<span>feof</span>(<span>$socket</span>)) {          <span>//</span><span>当还有待读取内容</span>

    <span>$info</span>.= <span>fgets</span>(<span>$socket</span>, 4096);  <span>//</span><span>每次读取4096个字节内容,并用.连接符连接到$info中。</span>
<span>} 
</span><span>echo</span> <span>$info</span>;<span>//</span><span>输出返回结果。</span>

当然以上是一个特别简单的例子,我们可以通过拼合更多的报头信息(加入Accept等)来将它更加完善。

接下来我们会说一些常用的POST方式。

如果您觉得本文对您有帮助,请您动手点一下推荐,如果有什么问题,可以在下方留言共同讨论,谢谢。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn