Socket用於處理序間通訊。處理序間通訊通常基於用戶端?服務端模型。此時,用戶端?服務端是可以彼此互動的應用程式。用戶端和服務端之間的互動需要串連。Socket編程負責的就是為應用程式之間建立可進行互動的串連。
用PHP建立一個簡單的用戶端?服務端,開發一個用戶端用於發送string訊息到服務端,服務端將相同的資訊反轉後返回給用戶端。
伺服器端
列表內容設定主機和連接埠 連接埠號碼可以是1024 -65535之間的任何正整數。
$host = "127.0.0.1";$port=5353;set_time_limit(0);//設定程式的執行時間 當為0的時候永久執行直到程式結束,如果為大於零的數字,則不管程式是否執行完成,到了設定的秒數,程式結束。
建立socket
$socket = socket_create(AF_INET,SOCK_STREAM,0) or die("could not create socket\n");
建立的socket資源綁定到IP地址和連接埠號碼。
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
啟動socket監聽
在綁定到IP和連接埠後,服務端開始等待用戶端的串連。在沒有串連之前它就一直等下去。
$result = socket_listen($socket,3) or die("Could not set up socket listener\n");
接受串連
這個函數會接受所建的socket傳入的串連請求。在接受來自用戶端socket的串連後,該函數返回另一個socket資源,實際上就是負責與相應的用戶端socket通訊。這裡的“$spawn”就是負責與用戶端socket通訊的socket資源。
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
從用戶端socket讀取訊息
$input = socket_read($spawn,1024) or die("Could not read input\n");
反轉訊息
$output = strrev($input)."\n";
發送訊息給用戶端socket
socket_write($spawn,$output,strlen(($output))) or die("Could not write output\n");
關閉socket
socket_close($spawn);socket_close($socket);
用戶端
設定主機和連接埠
註:這裡的連接埠和主機應該和服務端中的定義是相同的。
$host = "127.0.0.1";$port=5353;set_time_limit(0);
要發送的資訊
$message = "xiongchao";echo "Message To server :".$message."\n";
建立socket
$socket = socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create socket\n");
串連到服務端
此時和服務端不同,用戶端socket不綁定連接埠和主機。相反,它串連到服務端socket,等待接受來自用戶端socket的串連。
這一步建立了用戶端socket到服務端socket的串連。
$result = socket_connect($socket,$host,$port) or die("Could not connect to server\n");
寫入服務端socket
在此步驟中,用戶端socket的資料被發送到服務端socket。
socket_write($socket,$message,strlen($message)) or die("Could not send data to server\n");
讀取來自服務端的響應
$result = socket_read($socket,1024) or die("Could not read server response\n");echo "Reply from server:".$result;
關閉socket
socket_close($socket);
運行通訊
運行伺服器端
然後查看連接埠是否被監聽:
可以看見連接埠已被監聽
運行用戶端
當伺服器端運行成功後,且連接埠被監聽,此時運行用戶端
資訊成功發送到伺服器端,且收到伺服器端返回過來的信心
socket相關函數
socket_accept() 接受一個Socket串連
socket_bind() 把socket綁定在一個IP地址和連接埠上
socket_clear_error() 清除socket的錯誤或者最後的錯誤碼
socket_close() 關閉一個socket資源
socket_connect() 開始一個socket串連
socket_create_listen() 在指定連接埠開啟一個socket監聽
socket_create_pair() 產生一對沒有區別的socket到一個數組裡
socket_create() 產生一個socket,相當於產生一個socket的資料結構
socket_get_option() 擷取socket選項
socket_getpeername() 擷取遠程類似主機的ip地址
socket_getsockname() 擷取本地socket的ip地址
socket_iovec_add() 添加一個新的向量到一個分散/彙總的數組
socket_iovec_alloc() 這個函數建立一個能夠發送接收讀寫的iovec資料結構
socket_iovec_delete() 刪除一個已經分配的iovec
socket_iovec_fetch() 返回指定的iovec資源的資料
socket_iovec_free() 釋放一個iovec資源
socket_iovec_set() 設定iovec的資料新值
socket_last_error() 擷取當前socket的最後錯誤碼
socket_listen() 監聽由指定socket的所有串連
socket_read() 讀取指定長度的資料
socket_readv() 讀取從分散/彙總數組過來的資料
socket_recv() 從socket裡結束資料到緩衝
socket_recvfrom() 接受資料從指定的socket,如果沒有指定則預設當前socket
socket_recvmsg() 從iovec裡接受訊息
socket_select() 多路選擇
socket_send() 這個函數發送資料到已串連的socket
socket_sendmsg() 發送訊息到socket
socket_sendto() 發送訊息到指定地址的socket
socket_set_block() 在socket裡設定為塊模式
socket_set_nonblock() socket裡設定為非塊模式
socket_set_option() 設定socket選項
socket_shutdown() 這個函數允許你關閉讀、寫、或者指定的socket
socket_strerror() 返回指定錯誤號碼的詳細錯誤
socket_write() 寫資料到socket緩衝
socket_writev() 寫資料到分散/彙總數組
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。