PHP Socket實現websocket(三)Stream函數

除了socket函數也可使用stream函數來實現服務器與客戶端。php

參考PHP 的Stream實現服務器客戶端模型:服務器

http://php.net/manual/en/book.stream.phpsocket

http://blog.csdn.net/shagoo/article/details/6396089tcp

服務器端代碼:函數

 1 <?php 
 2     //設置不超時
 3     set_time_limit(0);
 4 
 5     class SocketServer
 6     {
 7         public function __construct($port)
 8         {
 9             global $errno, $errstr;
10 
11             $socket = stream_socket_server('tcp://127.0.0.1:'.$port, $errno, $errstr);
12             while($conn = stream_socket_accept($socket, -1))
13             {
14                 $buff = '';
15                 $data = '';
16                 
17                 //讀取請求數據直到遇到\r\n結束符
18                 while(!preg_match('#\r\n#', $buff))
19                 {
20                     $buff = fread($conn, 1024);
21                     $data .= preg_replace('#\r\n#', '', $buff);
22                 }
23                 fwrite($conn, $data);
24                 fclose($conn);
25             }
26             fclose($socket);
27         }
28     }
29 
30     new SocketServer(1212);

客戶端spa

 1 <?php 
 2     
 3     if(isset($argv[1]))
 4     {
 5         $msg = $argv[1];
 6         $socket = stream_socket_client('tcp://127.0.0.1:1212', $errno, $errstr);
 7         if(!$socket)
 8         {
 9             die($errno.$errstr);
10         }
11         else
12         {
13             // stream_set_blocking($socket, 0);
14             for($index = 0; $index < 3; $index++)
15             {
16                 fwrite($socket, " client: $msg $index ");
17                 usleep(100000);
18             }
19             fwrite($socket, "\r\n");
20             $response = fread($socket, 1024);
21             file_put_contents('log.txt', date("[H:i:s] ", time()).$response."\n", FILE_APPEND);
22             fclose($socket);
23         }
24     }
25     else
26     {
27         for($index = 0; $index < 3; $index++)
28         {
29             system('PHP '.__FILE__." $index:test");
30         }
31     }

cli下運行效果.net

 

去掉13行的設置非阻塞模式的代碼後,客戶端因爲設置了usleep()延時,沒法寫入服務器返回的數據。3d

固然在客戶端不在意接受結果的狀況下,可使用非阻塞模式來得到最大效率。code

相關文章
相關標籤/搜索