bytes.php 字节编码类
/** * byte数组与字符串转化类 * @author * created on 2011-7-15 */class bytes { /** * 转换一个string字符串为byte数组 * @param $str 需要转换的字符串 * @param $bytes 目标byte数组 * @author zikie */ public static function getbytes($str) { $len = strlen($str); $bytes = array(); for($i=0;$i= 128){ $byte = ord($str[$i]) - 256; }else{ $byte = ord($str[$i]); } $bytes[] = $byte ; } return $bytes; } /** * 将字节数组转化为string类型的数据 * @param $bytes 字节数组 * @param $str 目标字符串 * @return 一个string类型的数据 */ public static function tostr($bytes) { $str = ''; foreach($bytes as $ch) { $str .= chr($ch); } return $str; } /** * 转换一个int为byte数组 * @param $byt 目标byte数组 * @param $val 需要转换的字符串 * @author zikie */ public static function integertobytes($val) { $byt = array(); $byt[0] = ($val & 0xff); $byt[1] = ($val >> 8 & 0xff); $byt[2] = ($val >> 16 & 0xff); $byt[3] = ($val >> 24 & 0xff); return $byt; } /** * 从字节数组中指定的位置读取一个integer类型的数据 * @param $bytes 字节数组 * @param $position 指定的开始位置 * @return 一个integer类型的数据 */ public static function bytestointeger($bytes, $position) { $val = 0; $val = $bytes[$position + 3] & 0xff; $val > 8 & 0xff); return $byt; } /** * 从字节数组中指定的位置读取一个short类型的数据。 * @param $bytes 字节数组 * @param $position 指定的开始位置 * @return 一个short类型的数据 */ public static function bytestoshort($bytes, $position) { $val = 0; $val = $bytes[$position + 1] & 0xff; $val = $val <p class="sycode"> </p> <p> </p> <p> socket.class.php socket赋值类</p> <p class="sycode"> </p><p class="sycode"> </p> <pre style="代码" class="precsshei"><?phpdefine ("CONNECTED", true);define("DISCONNECTED", false);/** * Socket class * * * @author Seven */Class Socket{ private static $instance; private $connection = null; private $connectionState = DISCONNECTED; private $defaultHost = "127.0.0.1"; private $defaultPort = 80; private $defaultTimeout = 10; public $debug = false; function __construct() { } /** * Singleton pattern. Returns the same instance to all callers * * @return Socket */ public static function singleton() { if (self::$instance == null || ! self::$instance instanceof Socket) { self::$instance = new Socket(); } return self::$instance; } /** * Connects to the socket with the given address and port * * @return void */ public function connect($serverHost=false, $serverPort=false, $timeOut=false) { if($serverHost == false) { $serverHost = $this->defaultHost; } if($serverPort == false) { $serverPort = $this->defaultPort; } $this->defaultHost = $serverHost; $this->defaultPort = $serverPort; if($timeOut == false) { $timeOut = $this->defaultTimeout; } $this->connection = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); if(socket_connect($this->connection,$serverHost,$serverPort) == false) { $errorString = socket_strerror(socket_last_error($this->connection)); $this->_throwError("Connecting to {$serverHost}:{$serverPort} failed.<br>Reason: {$errorString}"); }else{ $this->_throwMsg("Socket connected!"); } $this->connectionState = CONNECTED; } /** * Disconnects from the server * * @return True on succes, false if the connection was already closed */ public function disconnect() { if($this->validateConnection()) { socket_close($this->connection); $this->connectionState = DISCONNECTED; $this->_throwMsg("Socket disconnected!"); return true; } return false; } /** * Sends a command to the server * * @return string Server response */ public function sendRequest($command) { if($this->validateConnection()) { $result = socket_write($this->connection,$command,strlen($command)); return $result; } $this->_throwError("Sending command \"{$command}\" failed.<br>Reason: Not connected"); } public function isConn() { return $this->connectionState; } public function getUnreadBytes() { $info = socket_get_status($this->connection); return $info['unread_bytes']; } public function getConnName(&$addr, &$port) { if ($this->validateConnection()) { socket_getsockname($this->connection,$addr,$port); } } /** * Gets the server response (not multilined) * * @return string Server response */ public function getResponse() { $read_set = array($this->connection); while (($events = socket_select($read_set, $write_set = NULL, $exception_set = NULL, 0)) !== false) { if ($events > 0) { foreach ($read_set as $so) { if (!is_resource($so)) { $this->_throwError("Receiving response from server failed.<br>Reason: Not connected"); return false; }elseif ( ( $ret = @socket_read($so,4096,PHP_BINARY_READ) ) == false){ $this->_throwError("Receiving response from server failed.<br>Reason: Not bytes to read"); return false; } return $ret; } } } return false; } public function waitForResponse() { if($this->validateConnection()) { return socket_read($this->connection, 2048); } $this->_throwError("Receiving response from server failed.<br>Reason: Not connected"); return false; } /** * Validates the connection state * * @return bool */ private function validateConnection() { return (is_resource($this->connection) && ($this->connectionState != DISCONNECTED)); } /** * Throws an error * * @return void */ private function _throwError($errorMessage) { echo "Socket error: " . $errorMessage; } /** * Throws an message * * @return void */ private function _throwMsg($msg) { if ($this->debug) { echo "Socket message: " . $msg . "\n\n"; } } /** * If there still was a connection alive, disconnect it */ public function __destruct() { $this->disconnect(); }}?>
PacketBase.class.php 打包类
<?php /** * PacketBase class * * 用以处理与c++服务端交互的sockets 包 * * 注意:不支持宽字符 * * @author Seven <seven@qoolu.com> * */class PacketBase extends ContentHandler{ private $head; private $params; private $opcode; /**************************construct***************************/ function __construct() { $num = func_num_args(); $args = func_get_args(); switch($num){ case 0: //do nothing 用来生成对象的 break; case 1: $this->__call('__construct1', $args); break; case 2: $this->__call('__construct2', $args); break; default: throw new Exception(); } } //无参数 public function __construct1($OPCODE) { $this->opcode = $OPCODE; $this->params = 0; } //有参数 public function __construct2($OPCODE, $PARAMS) { $this->opcode = $OPCODE; $this->params = $PARAMS; } //析构 function __destruct() { unset($this->head); unset($this->buf); } //打包 public function pack() { $head = $this->MakeHead($this->opcode,$this->params); return $head.$this->buf; } //解包 public function unpack($packet,$noHead = false) { $this->buf = $packet; if (!$noHead){ $recvHead = unpack("S2hd/I2pa",$packet); $SD = $recvHead[hd1];//SD $this->contentlen = $recvHead[hd2];//content len $this->opcode = $recvHead[pa1];//opcode $this->params = $recvHead[pa2];//params $this->pos = 12;//去除包头长度 if ($SD != 21316) { return false; } }else { $this->pos = 0; } return true; } public function GetOP() { if ($this->buf) { return $this->opcode; } return 0; } /************************private***************************/ //构造包头 private function MakeHead($opcode,$param) { return pack("SSII","SD",$this->TellPut(),$opcode,$param); } //用以模拟函数重载 private function __call($name, $arg) { return call_user_func_array(array($this, $name), $arg); } /***********************Uitl***************************/ //将16进制的op转成10进制 static function MakeOpcode($MAJOR_OP, $MINOR_OP) { return ((($MAJOR_OP & 0xffff) buf = ""; $this->contentlen = 0; $this->pos = 0; } function __destruct() { unset($this->buf); } public function PutInt($int) { $this->buf .= pack("i",(int)$int); } public function PutUTF($str) { $l = strlen($str); $this->buf .= pack("s",$l); $this->buf .= $str; } public function PutStr($str) { return $this->PutUTF($str); } public function TellPut() { return strlen($this->buf); } /*******************************************/ public function GetInt() { //$cont = substr($out,$l,4); $get = unpack("@".$this->pos."/i",$this->buf); if (is_int($get[1])){ $this->pos += 4; return $get[1]; } return 0; } public function GetShort() { $get = unpack("@".$this->pos."/S",$this->buf); if (is_int($get[1])){ $this->pos += 2; return $get[1]; } return 0; } public function GetUTF() { $getStrLen = $this->GetShort(); if ($getStrLen > 0) { $end = substr($this->buf,$this->pos,$getStrLen); $this->pos += $getStrLen; return $end; } return ''; } /***************************/ public function GetBuf() { return $this->buf; } public function SetBuf($strBuf) { $this->buf = $strBuf; } public function ResetBuf(){ $this->buf = ""; $this->contentlen = 0; $this->pos = 0; }}?>
格式
struct header{int type; // 消息类型int length; // 消息长度}struct MSG_Q2R2DB_PAYRESULT{int serialno; int openid; char payitem[512];int billno; int zoneid;int providetype; int coins; }调用的方法,另外需require两个php文件,一个是字节编码类,另外一个socket封装类,其实主要看字节编码类就可以了!
调用测试
public function index() { $socketAddr = "127.0.0.1"; $socketPort = "10000"; try { $selfPath = dirname ( __FILE__ ); require ($selfPath . "/../Tool/Bytes.php"); $bytes = new Bytes (); $payitem = "sdfasdfasdfsdfsdfsdfsdfsdfsdf"; $serialno = 1; $zoneid = 22; $openid = "CFF47C448D4AA2069361567B6F8299C2"; $billno = 1; $providetype = 1; $coins = 1; $headType = 10001; $headLength = 56 + intval(strlen($payitem )); $headType = $bytes->integerToBytes ( intval ( $headType ) ); $headLength = $bytes->integerToBytes ( intval ( $headLength ) ); $serialno = $bytes->integerToBytes ( intval ( $serialno ) ); $zoneid = $bytes->integerToBytes ( intval ( $zoneid ) ); $openid = $bytes->getBytes( $openid ); $payitem_len = $bytes->integerToBytes ( intval ( strlen($payitem) ) ); $payitem = $bytes->getBytes($payitem); $billno = $bytes->integerToBytes ( intval ( $billno ) ); $providetype = $bytes->integerToBytes ( intval ( $providetype ) ); $coins = $bytes->integerToBytes ( intval ( $coins ) ); $return_betys = array_merge ($headType , $headLength , $serialno , $zoneid , $openid,$payitem_len ,$payitem,$billno,$providetype,$coins); $msg = $bytes->toStr ($return_betys); $strLen = strlen($msg); $packet = pack("a{$strLen}", $msg); $pckLen = strlen($packet); $socket = Socket::singleton (); $socket->connect ( $socketAddr, $socketPort ); //连服务器 $sockResult = $socket->sendRequest ( $packet); // 将包发送给服务器 sleep ( 3 ); $socket->disconnect (); //关闭链接 } catch ( Exception $e ) { var_dump($e); $this->log_error("pay order send to server".$e->getMessage()); } }

종종 키워드와 추적 매개 변수로 혼란스러워하는 긴 URL은 방문자를 방해 할 수 있습니다. URL 단축 스크립트는 솔루션을 제공하여 소셜 미디어 및 기타 플랫폼에 이상적인 간결한 링크를 만듭니다. 이 스크립트는 개별 웹 사이트 a에 유용합니다

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

이것은 Laravel 백엔드가있는 React Application을 구축하는 데있어 시리즈의 두 번째이자 마지막 부분입니다. 이 시리즈의 첫 번째 부분에서는 기본 제품 목록 응용 프로그램을 위해 Laravel을 사용하여 편안한 API를 만들었습니다. 이 튜토리얼에서는 Dev가 될 것입니다

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> 'Hello World', 'github.com'=> [ 'foo'=> 'bar'], 'forge.laravel.com'=>

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

2025 PHP Landscape Survey는 현재 PHP 개발 동향을 조사합니다. 개발자와 비즈니스에 대한 통찰력을 제공하는 프레임 워크 사용, 배포 방법 및 과제를 탐색합니다. 이 조사는 현대 PHP Versio의 성장을 예상합니다

이 기사에서는 Laravel 웹 프레임 워크에서 알림 시스템을 탐색 할 것입니다. Laravel의 알림 시스템을 사용하면 다른 채널을 통해 사용자에게 알림을 보낼 수 있습니다. 오늘은 알림을 보낼 수있는 방법에 대해 논의합니다


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
