【php】socket編程基礎知識

php socket基礎知識

兩個程序相互通信連接實現的數據交換,連接的一端叫socket.每一個服務創建一個socket,並且綁定一個端口,不同的端口對應不同的服務。服務端socket監聽端口等待被連接,客戶端socket連接發起請求.

使用socket建立一個http連接

http協議是一個基於tcp協議的應用層協議,我們可以使用socket去發送一個http請求。

簡單的使用socket創建GET請求

<?php
// domain 可用的地址/協議
// type 套接字使用的類型
// protocol 協議名稱
<?php

// 創建socket套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 連接http服務器
socket_connect($socket, "localhost",80);

// 發送GET請求
$buf  = "GET http://localhost/helloworld.php?v=1\r\n";
$buf .= "Host:localhost\r\n";
$buf .= "User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36\r\n";
$buf .= "Connection:keep-alive\r\n";
socket_write($socket,$buf,strlen($buf)) or sprintf( "Unable to write to socket: %s", socket_strerror(socket_last_error()));
$recive = "";
while( "" !== ($read = socket_read($socket, 1024))){
    $recive .= $read;
}

// 關閉請求
socket_close($socket);

// 接受內容
echo $recive;

服務端 helloworld.php代碼

<?php

echo "Hello World <br />";
if(isset($_GET['v'])){
    echo "Version: {$_GET['v']}";
}

php Http.php 運行結果

Hello World <br />Version: 1

使用fsockopen創建http POST請求

方法介紹

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

客戶端腳本

<?php
// 打開socket連接資源
$fp = fsockopen("127.0.0.1",80,$errno,$errstr,5);

// 如果無法打開連接則提示失敗
if(!$fp){
    die("$errstr ($errno)<br />\n");
}
$data = http_build_query(array(
        "username" => "liyl",
        "pass" => "123456"
    )
);
$out = "POST /post.php HTTP/1.1\r\n";
$out .= "Host: localhost\r\n";
$out .= "Content-Length:" .strlen($data). "\r\n";
$out .= "Content-Type:application/x-www-form-urlencoded\r\n";
$out .= "Connection: keep-alive\r\n\r\n"; // 頭部與內容兩個換行
$out .=  $data ."\r\n\r\n"; // 結尾兩個換行

fwrite($fp,$out); // 寫入流
$ret = "";
// while( "" !== ($read = fread($fp,8192)) ){
//      $ret .= $read;
// }
while(!feof($fp)){
    $ret .= fgets($fp,1280);
}
fclose($fp);
echo $ret;

服務端腳本

<?php
if($_SERVER['REQUEST_METHOD'] == "POST"){
header("Content-Type:text/css;charset=UTF-8;");
echo "recive:";
print_r($_POST);
exit;   
}
?>
<form action="" method="POST">
<input type="hidden" name="test" value="test">
<button submit>GO</button>  
</form>

php HttpPost.php 運行結果


HTTP/1.1 200 OK
Date: Sat, 30 Apr 2016 07:03:52 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.6.20
Content-Length: 61
Connection: close
Content-Type: text/html; charset=UTF-8

recive:Array
(
    [username] => liyl
    [pass] => 123456
)

先打開了一個網絡連接,然後發送了報頭和報文.同時將響應的內容追加在這個網絡連接中

小結

  • 作爲php語言本身來說,它更加適合做一個socket客戶端,服務端的編寫我們更願意交給c語言,java語言。原因在於這些語言有更好的解決併發的特性

  • 只要我們遵循一定的網絡協議.就可以實現不同程序的數據通信

  • 網絡編程是一門很大的學問

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章