>  기사  >  php教程  >  PHP+socket推送消息到DDpush服务器

PHP+socket推送消息到DDpush服务器

PHP中文网
PHP中文网원래의
2016-05-23 13:07:481498검색

php代码

<?php
/**
 * 用Socket向DDpush服务器发送消息
 * 
 * @author Wang Wenbing<binny_w@qq.com>
 */
class DDpusher {
    /* Socket resource */
    private $socket = null;
    
    /**
     * 构造函数
     * @param string $strHost
     * @param int $intPort
     * @throws Exception
     */
    public function __construct($strHost, $intPort = 9999) {
        $strHost = strval($strHost);
        $intPort = intval($intPort);
        if (empty($strHost) || !$intPort) {
            throw new Exception(&#39;Wrong strHost or Wrong intPort&#39;);
        } elseif (($this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
            throw new Exception(&#39;Error at socket_create(): &#39; . socket_strerror(socket_last_error()));
        } elseif (socket_connect($this->socket, $strHost, $intPort) === false) {
            throw new Exception(&#39;Error at socket_connect(): &#39; . socket_strerror(socket_last_error()));
        }
    }
    
    /**
     * 生成32位的UUID,可以重写此函数
     * @param string $strUser
     * @return string(32)
     */
    private function getUUID($strUser) {
        $strUser = trim($strUser);
        return strlen($strUser) ? md5($strUser) : false;
    }

    /**
     * 检查Version和Appid参数
     * @param int $intVersion
     * @param int $intAppid
     * @return boolen
     */
    private function checkVersionAndAppid($intVersion, $intAppid) {
        return ($intVersion > 0 && $intVersion < 256 && $intAppid > 0 && $intAppid < 256);
    }
    
    /**
     * 发送通知
     * @param string $strUser
     * @return boolean $blnRe
     */
    public function push0x10($strUser, $intVersion = 1, $intAppid = 1) {
        $blnRe = false;
        $intVersion = intval($intVersion);
        $intAppid = intval($intAppid);
        if ($this->checkVersionAndAppid($intVersion, $intAppid) && ($strUUID = $this->getUUID($strUser)) !== false && $this->socket) {
            $strBin = pack(&#39;CCCH32n&#39;, $intVersion, $intAppid, 16, $strUUID, 0);
            socket_write($this->socket, $strBin, strlen($strBin)) && $blnRe = (bindec(socket_read($this->socket, 1)) == 0);
        } else {
            throw new Exception(&#39;Error at push0x10()&#39;);
        }
        return $blnRe;
    }
    
    /**
     * 发送分类信息
     * @param string $strUser
     * @param string $strHex 16位长的16进制字符
     * @param int $intVersion
     * @param int $intAppid
     * @return boolen $blnRe
     */
    public function push0x11($strUser, $strHex, $intVersion = 1, $intAppid = 1) {
        $blnRe = false;
        $intVersion = intval($intVersion);
        $intAppid = intval($intAppid);
        $strHex = trim($strHex);
        if ($this->checkVersionAndAppid($intVersion, $intAppid) && ($strUUID = $this->getUUID($strUser)) !== false && $this->socket && strlen($strHex) == 16) {
            $strBin = pack(&#39;CCCH32nH16&#39;, $intVersion, $intAppid, 17, $strUUID, 8, $strHex);
            socket_write($this->socket, $strBin, strlen($strBin)) && $blnRe = (bindec(socket_read($this->socket, 1)) == 0);
        } else {
            throw new Exception(&#39;Error at push0x11()&#39;);
        }
        return $blnRe;
    }
    
    /**
     * 发送500字节以内的字符消息
     * @param string $strUser
     * @param string $strMsg 必须是utf8编码的字符
     * @param int $intVersion
     * @param int $intAppid
     * @return boolen $blnRe
     * @throws Exception
     */
    public function push0x20($strUser, $strMsg, $intVersion = 1, $intAppid = 1) {
        $blnRe = false;
        $intVersion = intval($intVersion);
        $intAppid = intval($intAppid);
        // $strMsg = mb_convert_encoding($strMsg, &#39;utf8&#39;, &#39;gbk&#39;);
        $strMsg = trim($strMsg);
        $intLen = strlen($strMsg);
        $blnTemp = ($intLen > 0 && $intLen <= 500);
        if ($this->checkVersionAndAppid($intVersion, $intAppid) && ($strUUID = $this->getUUID($strUser)) !== false && $this->socket && $blnTemp) {
            $strBin = pack(&#39;CCCH32nA&#39; . $intLen, $intVersion, $intAppid, 32, $strUUID, $intLen, $strMsg);
            socket_write($this->socket, $strBin, strlen($strBin)) && $blnRe = (bindec(socket_read($this->socket, 1)) == 0);
        } else {
            throw new Exception(&#39;Error at push0x20()&#39;);
        }
        return $blnRe;
    }
    
    /**
     * 断开连接
     */
    public function __destruct() {
        if ($this->socket) {
            socket_close($this->socket);
            $this->socket = null;
        }
    }
    
}

/**
 * 使用Demo
 */
try {
    $obj = new DDpusher(&#39;172.16.14.7&#39;);
    $obj->push0x10(&#39;user01&#39;) && print(&#39;通知已发送<br />&#39;);
    $obj->push0x11(&#39;user01&#39;, &#39;0000000000000001&#39;) && print(&#39;分类已发送<br />&#39;);
    $obj->push0x20(&#39;user01&#39;, &#39;我爱你DDpush&#39;) && print(&#39;字符串消息已发送<br />&#39;);
} catch (Exception $ex) {
    echo $ex->getMessage();
}
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.