PHP Socket編程起步

來源:互聯網
上載者:User
關鍵字 PHP Socket編程起步

讓我們以一個簡單的例子開始---一個接收輸入字串,處理並返回這個字串到用戶端的TCP服務.下面是相應的代碼:

php 代碼:

// 設定一些基本的變數
$host="192.168.1.99";
$port=1234;
// 設定逾時時間
set_time_limit(0);
// 建立一個Socket
$socket=socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create
socket\n");
//綁定Socket到連接埠
$result=socket_bind($socket,$host,$port) or die("Could not bind to
socket\n");
// 開始監聽連結
$result=socket_listen($socket,3) or die("Could not set up socket
listener\n");
// accept incoming connections
// 另一個Socket來處理通訊
$spawn=socket_accept($socket) or die("Could not accept incoming
connection\n");
// 獲得用戶端的輸入
$input=socket_read($spawn,1024) or die("Could not read input\n");
// 清空輸入字串
$input=trim($input);
//處理用戶端輸入並返回結果
$output=strrev($input) ."\n";
socket_write($spawn,$output,strlen($output)) or die("Could not write
output\n");
// 關閉sockets
socket_close($spawn);
socket_close($socket);
?>
下面是其每一步驟的詳細說明:

1.第一步是建立兩個變數來儲存Socket啟動並執行伺服器的ip地址和連接埠.你可以設定為你自己的伺服器和連接埠(這個連接埠可以是1到65535之間的數字),前提是這個連接埠未被使用.

PHP 代碼: // 設定兩個變數
$host="192.168.1.99";
$port=1234;
?>
2.在伺服器端可以使用set_time_out()函數來確保PHP在等待用戶端串連時不會逾時.

PHP 代碼: // 逾時時間
set_time_limit(0);
?>
3.在前面的基礎上,現在該使用socket_creat()函數建立一個Socket了---這個函數返回一個Socket控制代碼,這個控制代碼將用在以後所有的函數中.

PHP 代碼: // 建立Socket
$socket=socket_create(AF_INET,SOCK_STREAM,0) or die("Could not create socket\n");
?>
第一個參數"AF_INET"用來指定網域名稱;
第二個參數"SOCK_STREM"告訴函數將建立一個什麼類型的Socket(在這個例子中是TCP類型)

因此,如果你想建立一個UDP Socket的話,你可以使用如下的代碼:

PHP 代碼: // 建立 socket
$socket=socket_create(AF_INET,SOCK_DGRAM,0) or die("Could not create socket\n");
?>
4.一旦建立了一個Socket控制代碼,下一步就是指定或者綁定它到指定的地址和連接埠.這可以通過socket_bind()函數來完成.

PHP 代碼: // 綁定 socket to 指定地址和連接埠
$result=socket_bind($socket,$host,$port) or die("Could not bind to socket\n");
?>
5.當Socket被建立好並綁定到一個連接埠後,就可以開始監聽外部的串連了.PHP允許你由socket_listen()函數來開始一個監聽,同時你可以指定一個數字(在這個例子中就是第二個參數:3)

PHP 代碼: // 開始監聽串連
$result=socket_listen($socket,3) or die("Could not set up socket listener\n");
?>
6.到現在,你的伺服器除了等待來自用戶端的串連請求外基本上什麼也沒有做.一旦一個用戶端的串連被收到,socket_assept()函數便開始起作用了,它接收串連請求並調用另一個子Socket來處理用戶端--伺服器間的資訊.

PHP 代碼: //接受請求連結
// 調用子socket 處理資訊
$spawn=socket_accept($socket) or die("Could not accept incoming connection\n");
?>
這個子socket現在就可以被隨後的用戶端--伺服器通訊所用了.

7.當一個串連被建立後,伺服器就會等待用戶端發送一些輸入資訊,這寫資訊可以由socket_read()函數來獲得,並把它賦值給PHP的$input變數.

PHP 代碼: // 讀取用戶端輸入
$input=socket_read($spawn,1024) or die("Could not read input\n");
?>
socker_read的第而個參數用以指定讀入的位元組數,你可以通過它來限制從用戶端擷取資料的大小.

注意:socket_read函數會一直讀取殼戶端資料,直到遇見\n,\t或者\0字元.PHP指令碼把這寫字元看做是輸入的結束符.

8.現在伺服器必須處理這些由用戶端發來是資料(在這個例子中的處理僅僅包含資料的輸入和回傳到用戶端).這部分可以由socket_write()函數來完成(使得由通訊socket發回一個資料流到用戶端成為可能)

PHP 代碼: // 處理用戶端輸入並返回資料
$output=strrev($input) ."\n";
socket_write($spawn,$output,strlen($output)) or die("Could not write output\n");
?>
9.一旦輸出被返回到用戶端,父/子socket都應通過socket_close()函數來終止

PHP 代碼: // 關閉 sockets
socket_close($spawn);
socket_close($socket);
?>
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.