'127.0.0.1', 'port' => '3000' ]; $this->options = $options + $defaults; $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); } /** * 建立socket连接 * * @return bool * @throws Exceptions\SocketError */ public function connect() { if (@socket_connect($this->socket, $this->options['host'], $this->options['port'])) { socket_set_option($this->socket, SOL_SOCKET, SO_RCVTIMEO, [ 'sec' => 50, 'usec' => 0 ]); return true; } throw new SocketError('Socket连接错误: ' . socket_last_error($this->socket)); } /** * 关闭socket * * @return void */ public function disconnect() { socket_shutdown($this->socket, 2); socket_close($this->socket); $this->socket = null; } /** * 发送socket数据,并读取返回信息. * * @param string $data Hexed data string * * @throws TypeError * @return string Answer returned from socket */ public function write($data) { // if (!ctype_xdigit($data)) { // throw new TypeError('$data必须是16进制字符串'); // } if ($this->socket === null) { $this->connect(); } // $binaryData = ''; // if ( !function_exists( 'hex2bin' ) ) { // print_r('expression1'); // $len = strlen( $data ); // for ( $i = 0; $i < $len; $i += 2 ) { // $binaryData .= pack( "H2", substr( $data, $i, 2 ) ); // } // }else{ // print_r('expression2'); $binaryData = hex2bin($data); // } // $binaryData = $data; // print_r("
发送报文 => $data
"); //发送数据 socket_write($this->socket, $binaryData); // print_r('
应答数据 => ');
		//读取应答数据
		$s      = $this->socket;
		$buffer = socket_read($s, self::READ_SIZE);

		if (!$buffer) {
			throw new SocketError('应答数据为空!');
		}

		$sockets = [$s];
		while(socket_select($sockets, $w, $e, 0)) {
			$buffer .= socket_read($s, self::READ_SIZE);
			$sockets = [$s];
		}

		$buffer = bin2hex($buffer);
// print_r('$buffer');

// print_r('
应答数据 => ');
// 		$buffer = '';
// 		if (false !== ($bytes = socket_recv($socket, $buffer, 2048, MSG_WAITALL))) {
// print_r ("共读取$bytes字节数据:");
// 		    if (!$buffer) {
// 				throw new SocketError('应答数据为空!');
// 		    }
// 		} else {
// 		    throw new SocketError ("应答数据读取失败,原因: " . socket_strerror(socket_last_error($socket)));
// 		}

// print_r('
'); socket_close($this->socket); return $buffer; } }