PHP Socket实现websocket(三)Stream函数

除了socket函数也可以使用stream函数来实现服务器与客户端。

参考PHP 的Stream实现服务器客户端模型:

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

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

服务器端代码:

 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);

客户端

 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下运行效果

 

去掉13行的设置非阻塞模式的代码后,客户端由于设置了usleep()延时,无法写入服务器返回的数据。

当然在客户端不在乎接受结果的情况下,可以使用非阻塞模式来获得最大效率。

 

posted @ 2016-06-06 13:04  xnuwu  阅读(8678)  评论(1编辑  收藏  举报