php socket获取数据类

<?php
define("CONNECTED", true);
define("DISCONNECTED", false);

/**
 * Socket class
 *
 *
 * @author ZT
 */
Class Socket
{
    private static $instance;

    private $connection = null;

    private $connectionState = DISCONNECTED;

    private $defaultHost = "127.0.0.1";

    private $defaultPort = 80;

    private $defaultTimeout = 20;

    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())
        {
            $socketResponse = "";
            while($val = socket_read($this->connection, 1024)){
                $socketResponse .= $val;
            }
            return $socketResponse;
        }

        $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();
    }
}

读取数据使用waitForResponse()方法

示例代码:

function send_socket($req, $ip, $port){
    $byte = new Bytes();
    $req_bytes = $byte->getbytes($req);
    $req_trans = $byte->tostr($req_bytes);
    $req_length = strlen($req_trans);
    $pack = pack("a{$req_length}", $req_trans);

    $socket = Socket::singleton();
    $socket->connect($ip, $port);
    $socket->sendRequest($pack);

    $socket_result = $socket->waitForResponse();

    $socket->disconnect();
    return $socket_result;
}

var_dump(send_socket("test", "127.0.0.1", 443));
时间: 2024-08-10 14:56:48

php socket获取数据类的相关文章

WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据(转)

WebForm.aspx 页面通过 AJAX 访问WebForm.aspx.cs类中的方法,获取数据 WebForm1.aspx 页面 (原生AJAX请求,写法一) <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="IsPostBack.WebForm1" %> <!DOCTYPE htm

通过不同方式获取接口(包括webService、Socket...)数据

最近一直在做接口程序的开发.发现因为每个公司的不同,他们会使用各种方式开放接口给我们使用它的数据,有HTTP.socket.存储过程.XFire... 不同的接口程序需要通过不同的方式获取他们放出来的数据. 1.HTTP(如何获取数据 ,以下是HTTP使用的过程和解析, ~~~ 主要看代码) 1. 创建HttpClient对象.    2. 创建请求方法的实例,并指定请求URL.如果需要发送GET请求,创建HttpGet对象:如果需要发送POST请求,创建HttpPost对象.    3. 如果

关于资讯,帖子类信息如何避免重复获取数据

场景说明: 当用户处于第一页的时候查看资讯列表(每页十条),这时,后台新增了新的资讯(假设十条),如果按照页数去拿第二页的数据,势必会取出重复的数据. 解决方案: 不按传统的分页方式去获取数据,采用时间戳是获取.拿最后一条的时间戳,进行条件筛选,取指定条数即可. 优点: 避免重复获取数据,加快查询效率.

C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB

小弟新手程序员一枚,代码技术和文章水平均不才.所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪. 我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入到数据库中. 楼主刚毕业菜鸟,没做过批量插入操作.借助baidu搜索得知SqlBulkCopy可以实现.SqlBulkCopy相关的原理,我现在还没了解就不摆弄了,以后补上! (不要问为什么不用google,公司内网就连msdn.microsoft.com都不给上!另外我公司是开发C#/.NET的,

ios学习(从网络上获取数据)

从网络上获取数据: 1.从网络上获取数据,采用如下这种方式会带来主线成阻塞现象,主线成主要是负责的是ui的交互(用户输入指令或数据,系统给一个反馈) 会进一步让ui停止交互 1)首先给我们将要下载的图片设置好位置 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"地址"]]]; UIImageView *imageView = [[UIImageVie

一个自定义 HBase Filter -“通过RowKeys来高性能获取数据”

大家在使用HBase和Solr搭建系统中经常遇到的一个问题就是:“我通过SOLR得到了RowKeys后,该怎样去HBase上取数据”.使用现有的Filter性能差劲,网上也没有现成的解决方案,我在这里把这个问题的解决办法分享给大家,抛砖引玉一下. Solr和HBase专辑 1.“关于Solr的使用总结的心得体会”(http://www.cnblogs.com/wgp13x/p/3742653.html) 2.“中文分词器性能比较?”(http://www.cnblogs.com/wgp13x/p

老蜗牛写采集:获取数据(正则篇)

致歉 首先感谢博友对这个系列的支持,很多加群的人都问我啥时候更新,我一直回答尽快,结果一拖就一年了.因为工作和生活占据我大量的时间,所以只能跟大伙说声抱歉. 使用正则获取数据 前两篇讲到如何采集html数据,那采集回来肯定要截取我们有用的部分,举个例子.我们要采集搜狐新闻的社会栏目,地址如下: http://news.sohu.com/shehuixinwen.shtml 我们首先获取到新闻列表,看上两章介绍到使用xNet获取到搜狐新闻的社会栏目的html源码,当然你可以使用httpreques

李洪强iOS开发-网络新闻获取数据思路回顾

李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对象 1.2 单例的实现,设置baseURL,设置超时时长等 02 创建一个分类, 传入一个类的参数返回一个数组,返回当前类的所有属性 用在模型中处理模型数据 03 创建图片轮播模型(model)类发送请求获取轮播图片的数据  3.1 定义属性: 标题,图片 定义两个类方法: (1)传入一个字典的参数

PDO获取数据的方法fetch()、fetchAll()、setFetchMode()、bindColumn()

PDO的数据获取方法与其他数据库扩展都非常类似,只要成功执行SELECT查询,都会有结果集对象产生.不管是使用PDO对象中的query()方法,还是使用prepare()和execute()等方法结合的预处理语句,执行SELECT查询都会得到相同的结果集对象PDOStatement.都需要通过PDOStatement类对象中的方法将数据遍历出来.下面介绍PDOStatement类中常见的几个获取结果集数据的方法. 1.fetch()方法 PDOStatement类中的fetch()方法可以将结果