QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

切换风格 注册 找回密码

php开发-PHP教程网


发表于 2020-1-4 11:13:58 | 显示全部楼层 |阅读模式
首先要使用composer来下载一个第三方扩展就可以实现php的websocket客户端,直接在当前目录生成下composer.json文件就可以了
composer require textalk/websocket
require('vendor/autoload.php');use WebSocket\Client;$client = new Client("ws://echo.websocket.org/");$client->send("Hello WebSocket.org!");echo $client->receive();
配合php的读取文件操作,只读取最新的追加的内容,下面代码为读取日志的客户端 , 发送给10.xx.2.xx:9501
  1. #!/usr/bin/env php
  2. <?php
  3. require('vendor/autoload.php');

  4. use WebSocket\Client;

  5. if(2 != count($argv)){
  6.     fwrite(
  7.         STDERR,
  8.         "调用格式错误!使用格式 ./xxx filename".PHP_EOL
  9.     );  
  10.     return 1;
  11. }

  12. $file_name      = $argv[1];
  13. define("MAX_SHOW", 8192);

  14. $file_size      = 0;
  15. $file_size_new  = 0;
  16. $add_size       = 0;
  17. $ignore_size    = 0;
  18. $fp = fopen($file_name, "r");
  19. $client = new Client("ws://10.xx.2.xx:9501/");
  20. while(1){
  21.     clearstatcache();
  22.     $file_size_new  = filesize($file_name);
  23.     $add_size       = $file_size_new - $file_size;
  24.     if($add_size > 0){
  25.         if($add_size > MAX_SHOW){
  26.             $ignore_size    = $add_size - MAX_SHOW;
  27.             $add_size       = MAX_SHOW;
  28.             fseek($fp, $file_size + $ignore_size);
  29.         }   
  30.         //直接输出内容
  31.         // fwrite(
  32.         //     STDOUT,
  33.         //     fread($fp, $add_size)
  34.         // );  
  35.         $client->send(fread($fp, $add_size));
  36.         $file_size  = $file_size_new;
  37.     }
  38.     usleep(50000);
  39. }

  40. fclose($fp);
复制代码
服务端的代码使用swoole作为服务端,并且在收到消息后给所有的连接广播,执行服务端
  1. <?php
  2. $server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
  3. $server->on('open', function (Swoole\WebSocket\Server $server, $request)use($fds) {
  4.     echo "server: handshake success with fd{$request->fd}\n";
  5. });

  6. $server->on('message', function (Swoole\WebSocket\Server $server, $frame)use($fds) {
  7.     echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
  8.     foreach($server->connections as $fd){
  9.         $server->push($fd, $frame->data);
  10.     }
  11. });

  12. $server->on('close', function ($ser, $fd) {
  13.     echo "client {$fd} closed\n";
  14. });

  15. $server->start();
复制代码

                               
登录/注册后可看大图



执行客户端

                               
登录/注册后可看大图


可以在浏览器直接实时输出

                               
登录/注册后可看大图

发表于 2020-1-4 11:14:40 | 显示全部楼层
佩服佩服!
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆



Archiver|  

662p开源网. Powered by Niuzen

© 2001-2014 Niuzen Inc.

返回顶部