zoukankan      html  css  js  c++  java
  • 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                 //读取请求数据直到遇到
    结束符
    18                 while(!preg_match('#
    #', $buff))
    19                 {
    20                     $buff = fread($conn, 1024);
    21                     $data .= preg_replace('#
    #', '', $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, "
    ");
    20             $response = fread($socket, 1024);
    21             file_put_contents('log.txt', date("[H:i:s] ", time()).$response."
    ", 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()延时,无法写入服务器返回的数据。

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

  • 相关阅读:
    广播与服务知识点总结
    Intent和Activity知识点总结
    数据库基础
    Java 中JOptionPane的基本使用方法
    Eclipse 自动补全功能失效解决办法及修改快捷键方法
    hdu 2095 find your present (2)
    sort()
    qsort()
    算法学习——分治算法
    NYOJ——街区最短路径问题
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5563450.html
Copyright © 2011-2022 走看看