PHP socket,server,cient,模拟post
fsockopen
以socket方式打开一个连接
我最常用的是模拟post
这个是小李挖掘的到的...不错
至于要模拟get方式....直接file_get_content就行了.
代码见后面
stream_socket_client, 代码见后面
这个和fsockopenfsockopen一样.以socket方式打开一个连接,只是参数不同
stream_socket_server
建立一个socket server端, 代码见后面
如果是建立的是tcp的server 就用stream_socket_accept进行通讯
如果是建立的是udp的server 就用stream_socket_recvfrom和stream_socket_sendto进行通讯,而且stream_socket_server中需要加个参数STREAM_SERVER_BIND
还有个socket扩展,这个是最基础的建立socket,但是从5.3.0开始就放到pecl中了.
这里就不介绍了.
---------------------------- stream_socket client---------------------------
<?php /** * @name test.php * @date Sun Jan 27 00:49:00 CST 2008 * @copyright 马永占(MyZ) * @author 马永占(MyZ) * @link http://blog.phprm.com/mayongzhan/ */ $xport = "tcp"; $port = "8001"; $ip = "127.0.0.1"; $address = "{$xport}://{$ip}:{$port}"; $fp = stream_socket_client($address, $errno, $errstr, 1); if (!$fp) { echo "$errstr ($errno)<br /> "; } else { fwrite($fp, " "); echo fread($fp, 1024); fclose($fp); }
---------------------------- streamSocketServer---------------------------
<?php /** * @name test2.php * @date Sun Jan 27 00:45:57 CST 2008 * @copyright 马永占(MyZ) * @author 马永占(MyZ) * @link http://blog.phprm.com/mayongzhan/ */ header("Content-type: text/html;charset=utf-8"); //设置不超时.服务端当然不能超时 set_time_limit(0); //得到可用socket $xportlist = stream_get_transports(); echo "transports: "; foreach ($xportlist as $value) { echo "{$value} "; } //定义一些东西 $xport = "tcp"; $port = "8001"; $address = "{$xport}://0.0.0.0:{$port}"; //建立socketserver if ($xport==''tcp'') { $socket = stream_socket_server($address, $errno, $errstr); } elseif ($xport==''udp'') { $socket = stream_socket_server($address, $errno, $errstr, STREAM_SERVER_BIND); } if (!$socket) { echo "{$errstr} ({$errno}) "; } else { echo "listening {$xport}:{$port} ... "; if ($xport==''tcp'') { //许可一个socket连接,-1超时 while ($conn = stream_socket_accept($socket,-1)) { //得到访问的端口 $peer = stream_socket_get_name($conn,true); echo "$peer "; fwrite($conn, ''The local time is '' . date("Y-m-d H:i:s ")); fclose($conn); } } elseif ($xport==''udp'') { do { //得到访问的端口 $pkt = stream_socket_recvfrom($socket, 1, 0, $peer); echo "$peer "; stream_socket_sendto($socket, date("Y-m-d H:i:s "), 0, $peer); } while ($pkt !== false); } //关闭socket fclose($socket); }
---------------------------- fsockopen(post)---------------------------
<?php /** * @name test.php * @date Sat Jan 26 23:01:23 CST 2008 * @copyright 马永占(MyZ) * @author 马永占(MyZ) * @link http://blog.phprm.com/mayongzhan/ */ /** * php 发送POST请求 * * @param string http://pic4.phprm.com/2015/07/04/$url.jpg 提交到的地址 * @param array $data 要提交的参数 array(''a''=>'''',''b''=>''''); * @return string */ function virtualPost($url, $data) { $url = parse_url($url); if (!$url) return "URL不能解析"; if (!isset($url[''port''])) $url[''port''] = ""; if (!isset($url[''query''])) $url[''query''] = ""; $encoded = ""; while (list($k,$v) = each($data)) { $encoded .= ($encoded ? "&" : ""); $encoded .= rawurlencode($k)."=".rawurlencode($v); } //$fp = stream_socket_client($url[''host''].":".($url[''port''] ? $url[''port''] : 80)); $fp = fsockopen($url[''host''], $url[''port''] ? $url[''port''] : 80); if (!$fp) return "不能打开到$url[host]的连接"; //发送 fputs($fp, sprintf("POST %s%s%s HTTP/1.0 ", $url[''path''], $url[''query''] ? "?" : "", $url[''query''])); fputs($fp, "Host: $url[host] "); fputs($fp, "Content-type: application/x-www-form-urlencoded "); fputs($fp, "Content-length: " . strlen($encoded) . " "); fputs($fp, "Connection: close "); fputs($fp, "$encoded "); //接受 $line = fgets($fp,1024); if (!eregi("^HTTP/1.. 200", $line)) return "返回结果错误"; //滤掉空行 $results = ""; $inheader = 1; while(!feof($fp)) { $line = fgets($fp,1024); //把剩余的头信息过滤掉 if ($inheader && ($line == " " || $line == " ")) { $inheader = 0; }elseif (!$inheader) { $results .= $line; } } fclose($fp); return $results; } echo virtualPost(''http://127.0.0.1/test/test2.php'',array(myz=>''马永占''));
永久链接:http://www.phprm.com/code/066478c2b251a1e9a709f303c46cb691.html
转载随意!带上文章地址吧。