文档章节

Socket封装

清澈
 清澈
发布于 2014/06/11 15:08
字数 275
阅读 33
收藏 0

<?php
// +----------------------------------------------------------------------
// | 新增udp传输
// +----------------------------------------------------------------------
// | author: bruce<376394074@qq.com>
// +----------------------------------------------------------------------
//

class Socket {
    protected $_config = array(
        'persistent'    => false,
        'host'            => 'localhost',
        'protocol'        => 'tcp',
        'port'            => 80,
        'timeout'        => 30
    );

    public $config = array();
    public $connection = null;
    public $connected = false;
    public $error = array();

    public function __construct($config = array()) {
        $this->config    =    array_merge($this->_config,$config);
        //echo getprotobyname($this->config['protocol']);
        if (!is_numeric($this->config['protocol'])) {
        //    $this->config['protocol'] = getprotobyname($this->config['protocol']);
        }
    }

    public function connect() {
        if ($this->connection != null) {
            $this->disconnect();
        }

        if ($this->config['persistent'] == true) {
            $tmp = null;
            if($this->config['protocol'] == 'tcp'){
                $this->connection = @pfsockopen($this->config['host'], $this->config['port'], $errNum, $errStr, $this->config['timeout']);
            }else{
                $this->connection = @pfsockopen("udp://".$this->config['host'], $this->config['port'], $errNum, $errStr, $this->config['timeout']);
            }
        } else {
            if($this->config['protocol'] == 'udp'){
                $this->connection = fsockopen("udp://".$this->config['host'], $this->config['port'], $errNum, $errStr, $this->config['timeout']);
            }else{
                $this->connection = fsockopen($this->config['host'], $this->config['port'], $errNum, $errStr, $this->config['timeout']);
            }
        }

        if (!empty($errNum) || !empty($errStr)) {
            $this->error($errStr, $errNum);
        }

        $this->connected = is_resource($this->connection);

        return $this->connected;
    }

    public function error() {
    }

    public function write($data) {
        if (!$this->connected) {
            if (!$this->connect()) {
                return false;
            }
        }
        return fwrite($this->connection, $data, strlen($data));
    }

    public function writeByte($data, $len) {
        if (!$this->connected) {
            if (!$this->connect()) {
                return false;
            }
        }
        return fwrite($this->connection, $data, $len);
    }


    public function read($length=1024) {
        if (!$this->connected) {
            if (!$this->connect()) {
                return false;
            }
        }

        if (!feof($this->connection)) {
            return fread($this->connection, $length);
        } else {
            return false;
        }
        $this->disconnect();
    }
/**
 * 关闭连接
 */
    public function disconnect() {
        if (!is_resource($this->connection)) {
            $this->connected = false;
            return true;
        }
        $this->connected = !fclose($this->connection);

        if (!$this->connected) {
            $this->connection = null;
        }
        return !$this->connected;
    }

    public function __destruct() {
        $this->disconnect();
    }

}

© 著作权归作者所有

上一篇: 常用正则
清澈
粉丝 1
博文 10
码字总数 1440
作品 0
西安
程序员
私信 提问
加载中

评论(0)

Socket开发框架之框架设计及分析

虽然在APP应用、Web应用、Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利、压力监测方面...

walb呀
2017/12/04
0
0
第二篇:白话tornado源码之待请求阶段

上篇《白话tornado源码之一个脚本引发的血案》用上帝视角多整个框架做了一个概述,同时也看清了web框架的的本质,下面我们从tornado程序的起始来分析其源码。 概述 上图是tornado程序启动以及...

武沛齐
2015/04/07
0
0
谈谈 Tomcat 请求处理流程

原文出处:Rainstorm 建议结合《谈谈 Tomcat 架构及启动过程[含部署]》一起看! 很多东西在时序图中体现的已经非常清楚了,没有必要再一步一步的作介绍,所以本文以图为主,然后对部分内容加以...

Rainstorm
2018/01/06
0
0
java实现Socket通信(一)---单线程服务

前言 使用 socket 的通信模式 java.net 程序包将基于TCP 通信的socket 封装为两个类:类Socket 表达了一个用于建立TCP 连接的socket,该socket 既可由客户程序使用,也可由服务程序 使用;类...

OneDay-X
2016/09/12
0
0
Socket总结 & node搭建简单的http服务器

网络中的进程 socket解决的是网络中进程间的通信,其首要解决的就是如何在网络中找到目标进程,这就要求进程拥有唯一性的索引,方便查找连接。 一台机器上,进程与进程之间通行,以PID作为唯...

烽穹寒渊
2016/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何离开/退出/停用Python virtualenv - How to leave/exit/deactivate a Python virtualenv

问题: I'm using virtualenv and the virtualenvwrapper. 我正在使用virtualenv和virtualenvwrapper。 I can switch between virtualenv's just fine using the workon command. 我可以使用......

javail
8分钟前
7
0
图片验证码输出 base64 字符串,适用于 自己存储key + 验证码来验证(不依赖于cookie)

<?php/** * @function getCode 生成验证码 * @author 张先生 * @date 2020-04-01 * @return array */// 获取验证码(参数:验证码个数,验证码宽度,验证码高度)if(!functio...

我才是张先生
31分钟前
7
0
SpringBoot和SpringCloud的区别

一、SpringBoot和SpringCloud简介 1、SpringBoot:是一个快速开发框架,通过用Maven依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动SpringMVC),简化X...

安然_oschina
54分钟前
19
0
IMX6ULL开发板-虚拟机安装Ubuntu系统

安装好了 VMware 虚拟机以后,我们就可以在 VMware 上安装 Ubuntu 系统了,首先我们去 Ubuntu 的 官网获取系统镜像,下载地址为:https://www.ubuntu.com/download/desktop,如下图所示: 从...

书白
今天
17
0
MyBatis Plus自定义SQL使用条件构造器QueryWrapper

1.注解的方式: @Select("select * from user_collection uc left join post p on uc.post_id = p.id ${ew.customSqlSegment}")IPage<Post> selectPosts(Page page, @Param(Constants.WRAP......

code-ortaerc
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部