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]; }

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP在数据库操作和服务器端逻辑处理中使用MySQLi和PDO扩展进行数据库交互,并通过会话管理等功能处理服务器端逻辑。1)使用MySQLi或PDO连接数据库,执行SQL查询。2)通过会话管理等功能处理HTTP请求和用户状态。3)使用事务确保数据库操作的原子性。4)防止SQL注入,使用异常处理和关闭连接来调试。5)通过索引和缓存优化性能,编写可读性高的代码并进行错误处理。

在PHP中使用预处理语句和PDO可以有效防范SQL注入攻击。1)使用PDO连接数据库并设置错误模式。2)通过prepare方法创建预处理语句,使用占位符和execute方法传递数据。3)处理查询结果并确保代码的安全性和性能。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP可以轻松创建互动网页内容。1)通过嵌入HTML动态生成内容,根据用户输入或数据库数据实时展示。2)处理表单提交并生成动态输出,确保使用htmlspecialchars防XSS。3)结合MySQL创建用户注册系统,使用password_hash和预处理语句增强安全性。掌握这些技巧将提升Web开发效率。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver CS6
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能