首页 > php代码 > PHP socket,server,cient,模拟post

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

转载随意!带上文章地址吧。

标签:none

发表留言