PHP Socket通訊編程

來源:互聯網
上載者:User
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() 寫資料到分散/彙總數組
  • 著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.