首頁 > php教程 > PHP开发 > 主體

PHP Socket程式設計起步

黄舟
發布: 2016-12-17 10:34:50
原創
1607 人瀏覽過

讓我們以一個簡單的例子開始---一個接收輸入字串,處理並返回這個字串到客戶端的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或者

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板