綁定的套接字
功能結合可以用來將套接字綁定到特定的地址和端口。它需要一個類似於connect函數的sockaddr_in結構。
簡單的例子
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if(!socket_bind($sock, "127.0.0.1" , 5000))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
現在,綁定完成後,它的時間,使插座聽連接。我們將套接字綁定到特定的IP地址和特定的端口號。通過這樣做,我們確保所有傳入該端口號的數據都被該應用程序接收。
這很明顯,你不能有2個套接字綁定到同一個端口。這條規則有例外,但我們會在其他一些文章中研究。
監聽連接
套接字綁定到一個端口,我們需要做的下一件事就是監聽連接後。爲此,我們需要將套接字置於聆聽模式。函數socket_listen
用於使套接字處於監聽模式。綁定後只需添加以下行。
//listen
socket_listen ($sock , 10)
函數socket_listen的第二個參數稱爲backlog。它控制在程序已經處於忙碌狀態時保持「等待」的傳入連接的數量。所以通過指定10,這意味着如果10個連接已經在等待處理,那麼第11個連接請求應該被拒絕。在檢查socket_accept之後,這將更加清晰。
現在是接受新連接的主要部分。
接受連接
功能socket_accept
用於此。
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
// Bind the source address
if(!socket_bind($sock, "127.0.0.1" , 5000))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
echo "Socket bind OK \n";
if(!socket_listen ($sock , 10))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not listen on socket : [$errorcode] $errormsg \n");
}
echo "Socket listen OK \n";
echo "Waiting for incoming connections... \n";
//Accept incoming connection - This is a blocking call
$client = socket_accept($sock);
//display information about the client who is connected
if(socket_getpeername($client , $address , $port))
{
echo "Client $address : $port is now connected to us.";
}
socket_close($client);
socket_close($sock);
輸出
運行該程序。它應該顯示 $ PHP /var/www/server.php 插槽創建 套接字綁定OK 插槽聽OK 等待傳入連接...
所以,現在這個計劃正在等待在端口5000的入站連接。不要關閉這個程序,讓它繼續運行。 現在客戶端可以在此端口上連接到它。我們將使用telnet客戶端來測試它。打開一個終端輸入 $遠程登錄本地主機5000
它會立即顯示 $遠程登錄本地主機5000 試圖127.0.0.1 ... 連到本地主機。 轉義字符是'^]'。 由外國主機關閉的連接。
服務器輸出將顯示 客戶端127.0.0.1:36689現在已連接到我們。
所以我們可以看到客戶端連接到服務器。嘗試上面的步驟,直到你完美的工作。
注意
的socket_getpeername功能是用來獲取它通過特定的套接字連接到服務器的客戶端的詳細信息。
這將如何幫我把SOAP調用的直播內容是什麼? –
您可以按照PHP參考進行更好的說明。 http://php.net/manual/en/function.http-get-request-body.php –
@NavnishBhardwaj你發佈的代碼與「超時」和/或在「流式傳輸SOAP響應」 「間隔」?我現在所看到的並不能解決問題,只是不能解決問題。請解釋爲什麼你的代碼對這個問題有用。 –