PHP Socket实现websocketStream实现

Posted 日拱一卒,功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP Socket实现websocketStream实现相关的知识,希望对你有一定的参考价值。

除了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()延时,无法写入服务器返回的数据。

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

 

以上是关于PHP Socket实现websocketStream实现的主要内容,如果未能解决你的问题,请参考以下文章

php socket简单原理及实现

PHP Socket实现websocketStream实现

PHP实现简单的socket与异步应用

PHP实现系统编程 --- 网络Socket及IO多路复用网摘

php实现socket

对SwooleWorkerman和php自带的socket的理解