PHP socket,server,cient,模拟post

原创
2016-06-08 17:31:38 759浏览

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=>''马永占''));

?>

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。