讓我們以一個簡單的例子開始---一個接收輸入字串,處理並返回這個字串到客戶端的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之間的數字),前提是這個連接埠未被使用.
<? // 设置两个变量 $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或者