發新話題 Report thanks

Socket 通訊模式總整理

Socket 通訊模式總整理
【TCP Server (監聽、接收)】

為了listen 必須使用socket_create,socket_bind,socket_listen 建立監聽環境

使用函式:socket_create,socket_bind,socket_listen
接收TCP Client 要求使用socket_accept,socket_read 來接收要求
複製內容到剪貼板
代碼:
<?php
$socket =socket_create (AF_INET,SOCK_STREAM,SOL_TCP );

$ip_address ='0.0.0.0';
$port ='2000';
$re_message ='cc';
socket_bind($socket,$address,$port );
socket_listen($socket );

while(1){
$msgsock =@socket_accept ($socket );
while($buffer =@socket_read($msgsock,1024)){// 讀取socket 內容
if ($buffer =='bb'){
socket_send($msgsock,$re_message,strlen($re_message ),0);
}
socket_shutdown($msgsock );
}
}
?>
【TCP Server (回覆)】

TCP Server 如果需要在接收到TCP Client 的訊息之後回傳給TCP Client,就需要使用socket_send 函數,不使用socket_write 的原因是因為Client 並無listen 固定的port,當Client 主動和Server 連接時,所開啟的port 每次接不相同,因此必須使用socket_send 直接回傳至當時連接所對應的port

socket_send($msgsock,$desc,strlen($desc),0);

【TCP Client】

socket_write,socket_read
複製內容到剪貼板
代碼:
<?php
$socket =@socket_create (AF_INET,SOCK_STREAM,SOL_TCP );
@socket_connect($socket,$ipaddress,$port );
socket_write($socket,$command,strlen($command ));
// 為了順利讀取回傳值,有時必須下個動作socket_read 前,sleep 一下
// usleep(500000);// 睡0.5秒
$read =@socket_read ($socket,64);
?>
【UDP Server (接收)】

使用UDP 擔任Server 時,比較特殊的是不需要使用socket_listen 來開啟listen,只需要持續接收即可得到想要的結果。

使用函式:socket_create,socket_bind,socket_recvfrom
複製內容到剪貼板
代碼:
<?php
$socket =socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);

$ip_address ='0.0.0.0';
$port ='2000';
$re_message ='cc';
socket_bind ($socket,$ip_address,$port );

while (1){
socket_recvfrom($socket,$buffer,1024,0,$client_ip,$client_port );
if ($buffer !=''){
echo $buffer."n";

if ($buffer =='bb'){
socket_sendto($socket,$re_message,strlen($re_message ),0,$client_ip,$client_port );
echo $client_port."n";
}
}
}
?>
【UDP Client (發出)】
複製內容到剪貼板
代碼:
<?php
$ip_address ='192.168.1.57';
$port ='2000';

$sock_udp =socket_create(AF_INET,SOCK_DGRAM,SOL_UDP );
socket_sendto($sock_udp,$temp,strlen($temp),0,$ip_address,$port );
?>
指令用法

socket_recv :接收udp 封包
socket_recvfrom :

socket_send :
socket_sendto :

半雙工?全雙工?

無論角色是Server or Client,兩邊都可以主動發出訊息讓另一方接收,如果是這樣,那Server 和Client 的差別在哪裡?

在只有一個process 之下,一定只能構成“半雙工”的條件,可是在multi-process 之下,就可以達到全雙工的通訊模式。

最後對於Server,Client 角色的定義應該還是需要回到原點,提供服務就必須固定IP,PORT 讓Client 有依循的條件。
如果您喜歡這篇文章,請按「讚」或分享給您的朋友,以示鼓勵。

TOP

thanks