PHP socket代码怎么写 才能接受客户端websocket发过来的数据
PHP socket代码怎么写 才能接受客户端websocket发过来的数据
百度了半天都没看到完整的代码 也没好的教程
回复讨论(解决方案)
建议直接使用workerman,它有现成的php 的 websocket server,性能非常棒
下面是三个workerman的websocket的线上的demo,官网有源代码,注释也比较详细,值得看下
http://kedou.workerman.net/
http://www.workerman.net:55151/
http://flap.workerman.net/
建议直接使用workerman,它有现成的php 的 websocket server,性能非常棒
下面是三个workerman的websocket的线上的demo,官网有源代码,注释也比较详细,值得看下
http://kedou.workerman.net/
http://www.workerman.net:55151/
http://flap.workerman.net/
他这个我用过不行 客户端发过来的数据根本收不到 要自己改得。。我想写原生
谁帮个忙写个原生的。
网上有现成的
/** * TCP操作基类 * @package SHIT\Protocol * @see \SHIT\Object */class TCPv4 extends \X\Core\Object { /** * 套接字句柄 * @var resource */ protected $rLink = null; /** * 构造函数 * @param string $ip IP地址 * @param int $port 端口号 * * @throws \X\Exception\Abstraction */ public function __construct($ip, $port) { $this->rLink = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if( false === $this->rLink ) { $this->rLink = null; $this->SetSocketError(__LINE__); throw new \X\Exception\Error($this->sError, $this->iErrno); } //设置连接超时为1秒 if( !$this->SetSendTimeout(1) ) { $this->Close(); throw new \X\Exception\Error($this->sError, $this->iErrno); }// echo 'sssssssssssss'; if( !@socket_connect($this->rLink, $ip, $port) ) { $this->SetSocketError(__LINE__); $this->Close(); throw new \X\Exception\Error($this->sError, $this->iErrno); }// var_dump($this->rLink);exit; if( !$this->SetSendTimeout(1) || !$this->SetRecvTimeout(3) ) { $this->Close(); throw new \X\Exception\Error($this->sError, $this->iErrno); } } /** * 析构函数 */ public function __destruct() { $this->Close(); } /** * 发送数据 * @param string $buffer 待发送数据的缓存 * @param int $flags 参数,默认为0 * * @return bool 发送成功返回true,否则返回false */ public function Send($buffer, $flags=0) { $buffer = strval($buffer); $bufLen = strlen($buffer); if( $bufLen <= 0 ) { return true; } $finishIndex = 0; $bytes = null;$zeroTimes = 0; do { if( $finishIndex > 0 ) { usleep(100); } $bytes = @socket_send($this->rLink, substr($buffer, $finishIndex), $bufLen - $finishIndex, $flags); if( false === $bytes ) { $this->SetSocketError(__LINE__); return false; } else if( $bytes <= 0 ) { ++$zeroTimes; if( $zeroTimes > 100 ) { $this->SetError('Send data 0 bytes more than 100 times', __LINE__); return false; } } else { $finishIndex += $bytes; } }while($finishIndex < $bufLen); return true; } /** * 获取数据 * @param string &$buffer 保存接收数据的缓存(注意:函数中会将此缓存清空后再存放接收到的数据) * @param int $length 接收数据长度 * @param int $flags 参数,默认为0 * * @return bool 发送成功返回true,否则返回false */ public function Recv(&$buffer, $length, $flags=0) { $length = intval($length); if( $length <= 0 ) { return true; } $buffer = '';$bytes = -1;$cache = '';$zeroTimes = 0; do { if( $bytes > 0 ) { usleep(100); } $bytes = @socket_recv($this->rLink, $cache, $length, $flags); if( false === $bytes ) { $this->SetSocketError(__LINE__); return false; } else if( $bytes <= 0 ) { ++$zeroTimes; if( $zeroTimes > 100 ) { $this->SetError('Receive data 0 bytes more than 100 times', __LINE__); return false; } } else { $length -= $bytes; } $buffer.=$cache; }while($length > 0); return true; } /** * 设置发送超时时间 * @param int $seconds 秒数,默认值为1 * @param int $microseconds 微秒,默认值为0 * * @return bool 发送成功返回true,否则返回false */ public function SetSendTimeout($seconds=1, $microseconds=0) { $seconds = intval($seconds);$microseconds = intval($microseconds); if( $seconds < 0 || $microseconds < 0 ) { $seconds = 1; $microseconds = 0; } if( !socket_set_option($this->rLink, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>$seconds, "usec"=>$microseconds)) ) { $this->SetSocketError(__LINE__); return false; } return true; } /** * 设置接收超时时间 * @param int $seconds 秒数,默认值为3 * @param int $microseconds 微秒,默认值为0 * * @return bool 发送成功返回true,否则返回false */ public function SetRecvTimeout($seconds=3, $microseconds=0) { $seconds = intval($seconds);$microseconds = intval($microseconds); if( $seconds < 0 || $microseconds < 0 ) { $seconds = 3; $microseconds = 0; } if( !socket_set_option($this->rLink, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>$seconds, "usec"=>$microseconds)) ) { $this->SetSocketError(__LINE__); return false; } return true; } /** * 关闭连接的套接字 * * @return void */ protected function Close() { if( is_resource($this->rLink) ) { socket_close($this->rLink); $this->rLink = null; } } /** * 设置套接字错误 * @param int $line 错误行 * * @return void */ protected function SetSocketError($line) { $code = socket_last_error(); $msg = socket_strerror($code); $this->SetError("[$code]$msg", $line); } /** * 获取不定长数据 * @param string &$buffer 保存接收数据的缓存(注意:函数中会将此缓存清空后再存放接收到的数据) * @param int $flags 参数,默认为0 * * @return bool 发送成功返回true,否则返回false */ public function RecvForDontKnowLength(&$buffer, $flags=0) { $buffer = '';$bytes = -1;$cache = ''; do { if( $bytes > 0 ) { usleep(100); } $bytes = @socket_recv($this->rLink, $cache, 65535, $flags); if( false === $bytes ) { $this->SetSocketError(__LINE__); return false; } else if( $bytes < 65535 ) { $buffer.=$cache; break; } $buffer.=$cache; }while(true); return true; }}
一个获取设备状态的例子,调用socket并获取数据
/* * 设备注销 * */ private function DeviceLogout() { $serverIp = $_SERVER ['SERVER_ADDR']; // 服务器IP $header = "\x01\x00\x30\x04" . pack ( 'n', 0 ); $buffer = pack ( 'N', $this->deviceID ) . $serverIp . "\0"; $buffer = $header . pack ( 'n', 8 + strlen ( $buffer ) ) . $buffer; $this->package = $buffer; }
/** * 发送数据包 * @param string $action socket发送动作:REGISTER_DEVICE、SENDCONFIG_DEVICE、GETDEVICE_INFORMATION、LOGOUT_DEVICE * @param string $ip ip地址 * * @return bytes 返回socket的数据 */ public function SendPackage($action = null,$ip=null,$lengthtype=null,$length=null) { $TCPv4 = new \X\Protocol\TCPv4 ( $ip, $this->agentPort ); $TCPv4->SetSendTimeout ( 5 ); $TCPv4->SetRecvTimeout ( 30 ); switch ($action) { case 'REGISTER_DEVICE' : $this->DeviceRegister(); break; case 'SENDCONFIG_DEVICE' : break; case 'GETDEVICE_INFORMATION' : $this->DeviceInformation (); break; case 'LOGOUT_DEVICE' : $this->DeviceLogout (); break; } $status = $TCPv4->Send ( $this->package ); $result = ''; if (0 === $lengthtype) // 定长 { $TCPv4->Recv ( $result, $length ); } else { $TCPv4->RecvForDontKnowLength ( $result ); } return $result; } public function RegisterDevice($ip=null) { /* * Action:注册行为: 1:检查设备是否注册于本Server; 2:注册该设备到本Server; 3:无视该设备已经注册于其他Server的情形,强制注册设备到本Server。 Result: 0:该设备成功注册于本Server; 1:注册失败; 2:该设备尚未注册; 3:该设备已在其他Server注册; 4:内部错误:该设备已在该Server注册,但指派的设备ID与现有的设备ID不同。 * */ $REG_TCP = new \X\Protocol\TCPv4 ( $ip, $this->agentPort ); $REG_TCP->SetSendTimeout ( 5 ); $REG_TCP->SetRecvTimeout ( 30 ); $this->DeviceRegister(); $status = $REG_TCP->Send ( $this->package ); $result = ''; $REG_TCP->Recv ( $result, 12 ); $SERVER_SOCKET_DATA = unpack ( 'N', substr ( $result, 8, 4 ) ); return $SERVER_SOCKET_DATA [1]; }

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。
