Socket in PHP

2011年11月16日 星期三

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 意見 :

張貼留言