【www.gdgbn.com--php常用代码】

 fsockopen

socket方式打开一个连接

我最常用的是模拟post

这个是小李挖掘的到的...不错

至于要模拟get方式....直接file_get_content就行了.

代码见后面

 

stream_socket_client, 代码见后面

这个和fsockopenfsockopen一样.socket方式打开一个连接,只是参数不同

 

stream_socket_server

建立一个socket server, 代码见后面

如果是建立的是tcpserver 就用stream_socket_accept进行通讯

如果是建立的是udpserver 就用stream_socket_recvfromstream_socket_sendto进行通讯,而且stream_socket_server中需要加个参数STREAM_SERVER_BIND

 

还有个socket扩展,这个是最基础的建立socket,但是从5.3.0开始就放到pecl中了.

这里就不介绍了.

 

---------------------------- stream_socket client---------------------------

 

/**

 * @name test.php

 * @date Sun Jan 27 00:49:00 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/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)
";

} else {

    fwrite($fp, " ");

    echo fread($fp, 1024);

    fclose($fp);

}

?>

 

---------------------------- streamSocketServer---------------------------

 

/**

 * @name test2.php

 * @date Sun Jan 27 00:45:57 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/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)---------------------------

 

/**

 * @name test.php

 * @date Sat Jan 26 23:01:23 CST 2008

 * @copyright 马永占(MyZ)

 * @author 马永占(MyZ)

 * @link http://blog.111cn.net/mayongzhan/

 */

 

/**

 * php 发送POST请求

 *

 * @param string $url 提交到的地址

 * @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.gdgbn.com/jiaocheng/12467/