真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP下Socket編程的應(yīng)用

這篇文章主要介紹“PHP 下 Socket 編程的應(yīng)用”,在日常操作中,相信很多人在PHP 下 Socket 編程的應(yīng)用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP 下 Socket 編程的應(yīng)用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、五寨網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場景定制、成都商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為五寨等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

Socket 并不是一個(gè)協(xié)議, 其本質(zhì)是對 TCP/IP 協(xié)議進(jìn)行的封裝, 并對外提供了一組接口, 允許用戶可以自由的按相關(guān)協(xié)議組裝數(shù)據(jù), 與服務(wù)器進(jìn)行交互. 一切基于 TCP/IP 的協(xié)議可以通過 Socket 進(jìn)行實(shí)現(xiàn).

PHP 通過 Socket 擴(kuò)展也可以實(shí)現(xiàn)對 Socket 編程. 使用 PHP 進(jìn)行 Socket 通信的簡單過程如下:

PHP 下 Socket 編程的應(yīng)用

PHP Socket 編程涉及的主要函數(shù):

socket_create(): 初始化一個(gè)socket資源
socket_bind(): 將socket資源綁定到指定地址
socket_listen(): 監(jiān)聽socket的連接請求
socket_accept(): 接受來自客戶端的連接, 返回一個(gè)新socket資源用于通訊. 如果接收到多個(gè)連接, 只會(huì)使用第一個(gè)連接. 沒有連接時(shí), 該函數(shù)保持堵塞狀態(tài), 直到有新的連接. 如果使用socket_set_blocking() or socket_set_nonblock()將socket設(shè)置為非堵塞狀態(tài), 沒有連接時(shí)該函數(shù)返回FALSE
socket_read(): 從連接資源中讀取指定字節(jié)數(shù)的數(shù)據(jù), 讀取成功時(shí), 返回字符串. 失敗時(shí), 返回FALSE. 沒有數(shù)據(jù)時(shí), 返回空字符串
socket_write(): 向連接資源寫入信息返回給客戶端
socket_strerror(): 根據(jù)錯(cuò)誤號獲取錯(cuò)誤消息
socket_last_error(): 返回上一次錯(cuò)誤的錯(cuò)誤號

示例一: 客戶端和服務(wù)端的一對一通信, 由客戶端推送數(shù)據(jù)到服務(wù)端

client.php

$host = '127.0.0.1';
$port = 65533;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
exit('初始化socket資源錯(cuò)誤: ' . socket_strerror(socket_last_error($sock)));
}
 
if(socket_connect($sock, $host, $port) === FALSE)
{
exit('連接socket失敗: ' . socket_strerror(socket_last_error($sock)));
}
 
$msg = '客戶端1消息';
if(socket_write($sock, $msg) === FALSE)
{
exit('發(fā)送數(shù)據(jù)失敗: ' . socket_strerror(socket_last_error($sock)));
}
 
$data = '';
// 循環(huán)讀取指定長度的服務(wù)器響應(yīng)數(shù)據(jù)
while($response = socket_read($sock, 4))
{
$data .= $response;
}
echo $data . PHP_EOL;
 
socket_close($sock);

server.php

set_time_limit(0);
 
$ip = '127.0.0.1';
$port = '65533';
$count = 1;
// socket_create(): 初始化一個(gè)socket資源
// socket_strerror(): 根據(jù)錯(cuò)誤號獲取錯(cuò)誤消息
// socket_last_error(): 返回上一次錯(cuò)誤的錯(cuò)誤號
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
echo '初始化socket失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_bind(): 將socket資源綁定到指定地址
if(!socket_bind($sock, $ip, $port))
{
echo '綁定端口失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_listen(): 監(jiān)聽socket的連接請求
if(!socket_listen($sock))
{
echo '監(jiān)聽端口: ' . socket_strerror(socket_last_error($sock));
die;
}
 
while(1)
{
// socket_accept(): 接受來自客戶端的連接, 返回一個(gè)新socket資源用于通訊. 如果接收到多個(gè)連接, 只會(huì)使用第一個(gè)連接. 沒有連接時(shí), 該函數(shù)保持堵塞狀態(tài), 直到有新的連接. 如果使用socket_set_blocking() or socket_set_nonblock()將socket設(shè)置為非堵塞狀態(tài), 沒有連接時(shí)該函數(shù)返回FALSE
;
if(($client = socket_accept($sock)) === FALSE)
{
echo '接收連接失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_read(): 從連接資源中讀取指定字節(jié)數(shù)的數(shù)據(jù), 讀取成功時(shí), 返回字符串. 失敗時(shí), 返回FALSE. 沒有數(shù)據(jù)時(shí), 返回空字符串
$content = socket_read($client, 1024);
if($content !== FALSE)
{
echo '消息' . $count . ': ' . $content . PHP_EOL;
$count++;
$response = '接收信息成功!';
// socket_write(): 向連接資源寫入信息返回給客戶端
socket_write($client, $response);
socket_close($client);
}else
{
exit('讀取數(shù)據(jù)錯(cuò)誤: ' . socket_strerror(socket_last_error($client)));
}
}
 
socket_close($sock);

首先在命令行下啟動(dòng) server.php, 然后啟動(dòng) client.php.

服務(wù)消息提示:

PHP 下 Socket 編程的應(yīng)用

客戶端接收的響應(yīng)消息提示

PHP 下 Socket 編程的應(yīng)用

客戶端接收到服務(wù)端的響應(yīng)消息后將斷開連接, 而服務(wù)端會(huì)一直掛起, 等待下一次的連接.

示例二: 客戶端和服務(wù)端的一對一通信, 由服務(wù)端推送數(shù)據(jù)到客戶端

client.php

// 服務(wù)端地址
$host = '127.0.0.1';
$port = 65533;
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
exit('初始化socket資源錯(cuò)誤: ' . socket_strerror(socket_last_error($sock)));
}
 
if(socket_connect($sock, $host, $port) === FALSE)
{
exit('連接socket失敗: ' . socket_strerror(socket_last_error($sock)));
}
 
$data = '';
// 循環(huán)讀取指定長度的服務(wù)器響應(yīng)數(shù)據(jù)
while($response = socket_read($sock, 4))
{
$data .= $response;
}
socket_write($sock, '接收消息成功');
echo $data . PHP_EOL;
 
socket_close($sock);

server.php

set_time_limit(0);
 
$ip = '127.0.0.1';
$port = '65533';
// socket_create(): 初始化一個(gè)socket資源
// socket_strerror(): 根據(jù)錯(cuò)誤號獲取錯(cuò)誤消息
// socket_last_error(): 返回上一次錯(cuò)誤的錯(cuò)誤號
if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE)
{
echo '初始化socket失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_bind(): 將socket資源綁定到指定地址
if(!socket_bind($sock, $ip, $port))
{
echo '綁定端口失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// socket_listen(): 監(jiān)聽socket的連接請求
if(!socket_listen($sock))
{
echo '監(jiān)聽端口: ' . socket_strerror(socket_last_error($sock));
die;
}
 
// 建立死循環(huán),循環(huán)接收客戶端的連接請求,持續(xù)向連接上的客戶端推送消息
while(1)
{
// socket_accept(): 接受來自客戶端的連接, 返回一個(gè)新socket資源用于通訊. 如果接收到多個(gè)連接, 只會(huì)使用第一個(gè)連接. 沒有連接時(shí), 該函數(shù)保持堵塞狀態(tài), 直到有新的連接. 如果使用socket_set_blocking() or socket_set_nonblock()將socket設(shè)置為非堵塞狀態(tài), 沒有連接時(shí)該函數(shù)返回FALSE
;
if(($client = socket_accept($sock)) === FALSE)
{
echo '接收連接失敗: ' . socket_strerror(socket_last_error($sock));
die;
}
$data = '服務(wù)端消息: ' . date('Y-m-d H:i:s', time());
socket_write($client, $data);
socket_close($client);
}
 
socket_close($sock);

首先通過命令行啟動(dòng) server.php, 此時(shí)服務(wù)端將掛起, 持續(xù)監(jiān)聽指定端口. 然后啟動(dòng) client.php, 客戶端發(fā)起連接, 連接成功后, 將接收到服務(wù)端推送的數(shù)據(jù).

客戶單響應(yīng)提示:

PHP 下 Socket 編程的應(yīng)用

到此,關(guān)于“PHP 下 Socket 編程的應(yīng)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


網(wǎng)站欄目:PHP下Socket編程的應(yīng)用
本文URL:http://weahome.cn/article/gidpjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部