Socket in PHP
這篇粗略使用PHP實現client server 的socket程式,底下會稍加解釋如何運作。
透過下列的方式可以實現簡單的client server的socket應用,讓client傳送指令給server端去執行,並於server端結束後會回傳Executed succussfully的訊息給client。
*需要先在php.ini中 extension sockets.so
Server Node:
<?php
//使用tcp的公開協議類型
$commonProtocol = getprotobyname("tcp");
// 建立一個以tcp協議,依順序執行基於stream的socket連接
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
//綁定ip和port
socket_bind($socket, '192.168.39.104', 1338);
//開始監聽port
socket_listen($socket);
while(true)
{
//接受連接進來的連線
$connection = socket_accept($socket);
printf("Socket connecting\r\n");
//讀取client端送來的資料
$data = socket_read($connection, 1024);
if($data!=NULL && $data!="")
{
system($data);
//把資料送至clinet端
socket_write($connection, "Executed succussfully\r\n");
}else{
socket_write($connection, "Executed failure\r\n");
}
//關閉socket連線
socket_close($connection);
printf("Closed the socket\r\n");
}
?>
Client Node:
<?php
class socket
{
var $socket;
public $connection_success=0;
function socket($ip,$port)
{
//開啟一個用tcp協議的socket
$this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
//連結到server
$result = socket_connect($this->socket,$ip,$port);
if ($result <1)
{
//印出錯誤訊息
echo "Socket connect failed. Cause:".socket_strerror(socket_last_error())."<br>";
} else{
echo "Connect Successfully<br>";
$this->connection_success=1;
return 1;
}
}
function sendmsg($msg)
{
//把$msg傳送到server端
socket_write($this->socket,$msg,strlen($msg));
if($msg=="" || $msg==NULL)
{
printf("Send : EMPTY<br>");
return 0;
}else{
printf("Send : ".$msg."<br>");
return 1;
}
}
function recvmsg()
{
//接收server端送的字串
$result = socket_read($this->socket,100);
if($result=="" || $result==NULL)
{
printf("Receive : EMPTY<br>");
return 0;
}else{
printf("Receive :".$result."<br>");
return 1;
}
}
function close()
{
//終止連線
socket_close($this->socket);
}
}
function check_success($result)
{
if($result==0)
{
$success_or_not="Failed";
return;
}
}
$success_or_not="Success";
$a = new socket("192.168.39.104","1338");
if($a->connection_success==1)
{
check_success($a->sendmsg("ls"));
check_success($a->recvmsg());
$a->close();
}else{
$success_or_not="Failed";
}
echo "Executed ".$success_or_not."<br>";
Problem:
但是有一些問題尚未解決,例如這是阻塞式的socket程式,需要尋找另外的解決方式。
這邊做個紀錄。 如果有寫錯的地方麻煩幫忙改正,感謝!
0 意見 :
張貼留言