讓我們以乙個簡單的例子開始---乙個接收輸入字串,處理並返回這個字串到客戶端的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"
); ?>
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
); ?>
PHP SOCKET程式設計!
server.php php 確保在連線客戶端時不會超時 set time limit 0 設定ip和埠號 address 伺服器自己的ip port 埠號 建立乙個socket if sock socket create af inet sock stream sol tcp 0 繫結到socke...
php socket程式設計通訊
我們程式設計就是按這個順序的,請看下面的圖 建立乙個連線 socket socket create af inet,sock stream,sol tcp or die cannot create socket n 繫結socket到埠 result socket bind socket,host,...
PHP Socket 程式設計詳解
最近在做的專案有一項需要耗時任務在後台執行的功能,雖然php並不是非常適合做常駐後台的守護程序,但是由於專案主要 都是基於php實現,如 果執行在後台的守護程序改換別的語言會非常不方便。所以不可避免會涉及到web端和daemon部分的通訊,socket是乙個不錯的方式。socket的英文原義是 孔 ...