Hi-Fi優質I.T網:PHP嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙?forum_id=51-討論區
您尚未登入...
帳號:
密碼:

忘記密碼 
 
  訂閱電子報

取消   訂閱
 
討論區>>PHP嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙踝蕭嚙?forum_id=51<<

 
 
發起人:
ruby
一般會員
張貼時間:2008/11/10-13:24:28
   檢舉

 主題:PHP Socket編程

//PHP Socket  程序
[php]// 設定一些基本的變量 [php]//  置一些基本的  量
$host = "192.168.1.99"; $host = "192.168.1.99";
$port = 1234; $port = 1234;
// 設定超時時間 //  置超      
set_time_limit(0);
// 創建一個Socket //  建一  Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n"); $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not createsocket\n");
//綁定Socket到端口 //  定Socket到端口
$result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n"); $result = socket_bind($socket, $host, $port) or die("Could not bind tosocket\n");
// 開始監聽鏈接 //  始      接
$result = socket_listen($socket, 3) or die("Could not set up socketlistener\n"); $result = socket_listen($socket, 3) or die("Could not set up socketlistener\n");
// accept incoming connections // accept incoming connections
// 另一個Socket來處理通信 //另一  Socket    理通信
$spawn = socket_accept($socket) or die("Could not accept incomingconnection\n"); $spawn = socket_accept($socket) or die("Could not accept incomingconnection\n");
// 獲得客戶端的輸入 //  得客  端的  入
$input = socket_read($spawn, 1024) or die("Could not read input\n"); $input = socket_read($spawn, 1024) or die("Could not read input\n");
// 清空輸入字元串 //清空  入字元串
$input = trim($input); $input = trim($input);
//處理客戶端輸入並返回結果 //  理客  端  入  返回  果
$output = strrev($input) . "\n"; $output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
// 關閉sockets //    sockets
socket_close($spawn);
socket_close($socket);
[/php]


下面是其每一步驟的詳細說明:下面是其每一步  的      明:


1.第一步是建立兩個變量來儲存Socket營運的伺服器的IP位址和端口.你可以設定為你自己的伺服器和端口(這個端口可以是1到65535之間的數字),前提是這個端口未被使用. 1.第一步是建立      量  儲存Socket  行的服  器的IP位址和端口.你可以  置  你自己的服  器和端口(    端口可以是1到65535之  的  字),前提是    端口未被使用.


[php]// 設定兩個變量 [php]//  置      量
$host = "192.168.1.99"; $host = "192.168.1.99";
$port = 1234; $port = 1234;
[/php]


2.在伺服器端可以使用set_time_out()函數來確保PHP在等待客戶端連接時不會超時. 2.在服  器端可以使用set_time_out()函      保PHP在等待客  端  接  不  超  .


[php]// 超時時間 [php]//超      
set_time_limit(0);
[/php]


3.在前面的基礎上,現下該使用socket_creat()函數創建一個Socket了─這個函數返回一個Socket句柄,這個句柄將用在以後所有的函數中. 3.在前面的基  上,  在  使用socket_creat()函    建一  Socket了─    函  返回一  Socket句柄,    句柄  用在以後所有的函  中.


[php]// 創建Socket [php]//  建Socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create
socket\n");
[/php]


第一個參數”AF_INET”用來指定域名;第一      ”AF_INET”用  指定域名;
第二個參數”SOCK_STREM”告訴函數將創建一個什麼類型的Socket(在這個例子中是TCP類型)第二      ”SOCK_STREM”告  函      建一  什    型的Socket(在    例子中是TCP  型)


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


[php]// 創建 socket [php]//  建socket
$socket = socket_create(AF_INET, SOCK_DGRAM, 0) or die("Could not create $socket = socket_create(AF_INET, SOCK_DGRAM, 0) or die("Could not create
socket\n");
[/php]


4.一旦創建了一個Socket句柄,下一步就是指定或者綁定它到指定的位址和端口.這可以透過socket_bind()函數來完成. 4.一旦  建了一  Socket句柄,下一步就是指定或者  定它到指定的位址和端口.  可以通  socket_bind()函    完成.


[php]// 綁定 socket to 指定位址和端口 [php]//  定socket to指定位址和端口
$result = socket_bind($socket, $host, $port) or die("Could not bind to $result = socket_bind($socket, $host, $port) or die("Could not bind to
socket\n");[/php]


5.當Socket被創建好並綁定到一個端口後,就可以開始監聽外部的連接了.PHP允許你由socket_listen()函數來開始一個監聽,同時你可以指定一個數字(在這個例子中就是第二個參數:3) 5.  Socket被  建好    定到一  端口後,就可以  始    外部的  接了.PHP允  你由socket_listen()函      始一      ,同  你可以指定一    字(在    例子中就是第二      :3)


[php]// 開始監聽連接 [php]//  始      接
$result = socket_listen($socket, 3) or die("Could not set up socket $result = socket_listen($socket, 3) or die("Could not set up socket
listener\n");[/php]


6.到現下,你的伺服器除了等待來自客戶端的連接請求外基本上什麼也沒有做.一旦一個客戶端的連接被收到,socket_assept()函數便開始起作用了,它接收連接請求並調用另一個子Socket來處理客戶端  伺服器間的訊息. 6.到  在,你的服  器除了等待  自客  端的  接  求外基本上什  也  有做.一旦一  客  端的  接被收到,socket_assept()函  便  始起作用了,它接收  接  求    用另一  子Socket    理客  端  服  器  的訊息.


[php]//接受請求鏈接 [php]//接受  求  接
// 調用子socket 處理訊息 //  用子socket  理訊息
$spawn = socket_accept($socket) or die("Could not accept incoming $spawn = socket_accept($socket) or die("Could not accept incoming
connection\n");
[/php]
這個子socket現下就可以被隨後的客戶端  伺服器通信所用了.    子socket  在就可以被  後的客  端  服  器通信所用了.


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


[php]// 讀取客戶端輸入 [php]//  取客  端  入
$input = socket_read($spawn, 1024) or die("Could not read input\n"); $input = socket_read($spawn, 1024) or die("Could not read input\n");
?&gt;[/php]


socker_read的第而個參數用以指定讀入的位元組數,你可以透過它來限制從客戶端獲取數據的大小. socker_read的第而      用以指定  入的字    ,你可以通  它  限制  客  端  取    的大小.


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


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


[php]// 處理客戶端輸入並返回數據 [php]//  理客  端  入  返回    
$output = strrev($input) . "\n"; $output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write socket_write($spawn, $output, strlen ($output)) or die("Could not write
output\n");
[/php]


9.一旦輸出被返回到客戶端,父/子socket都應透過socket_close()函數來終止 9.一旦  出被返回到客  端,父/子socket都  通  socket_close()函      止


[php]// 關閉 sockets [php]//    sockets
socket_close($spawn);
socket_close($socket);
[/php]


簽名
By Ruby

 



 

Hi-Fi優質I.T網”站內所有文章、圖片除特別加註外均屬本站所有,如有任何問題請來信告知
請支持言論自由,討論區所發表之言論不代表本站立場
Hi-Fi優質I.T網”版權所有2004©
---最佳顯示效果1024*768---