客户端

<?php
header("content-type:text/html;charset=utf-8");

/*
 * 客户端
 * */

#服务器ip
$ip = '127.0.0.1';

#端口
$port = '8080';

#发送的数据
$str = '测试';

#创建一个套接字(通讯节点)      协议,类型,具体协议
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

#链接服务器
socket_connect($socket,$ip,$port);

#向服务写入数据
socket_write($socket,$str,strlen($str));

#获取内容
$msg = socket_read($socket,1024);

var_dump($msg);

#关闭连接
socket_close($socket);

/**
 * user_socket.php
 *
 * socketPhp客户端
 *
 * 2017 Copyright (c) https://note.jsx6.com
 *
 * 修改历史
 * ----------------------------------------
 * 2015/10/17, 作者: 降省心(QQ:1348550820), 操作:创建
 **/

 
服务器端

<?php
header("content-type:text/html;charset=utf-8");

$class = new socket();

$class->white = $class->read;
p($class->read);
p($class->error);

/*
 * 服务器端
 * */

class socket
{

    #服务器地址
    public $ip = '0.0.0.0';
    #服务器端口
    public $port = '8080';
    //正在创建的套接字资源
    public $socket;
    #已连接的套接字资源
    public $listen_connect;
    #错误日志路径
    public $error_src = './log';
    #获取客户端发送内容
    public $read;
    #回复客户端
    public $white = false;
    #错误
    public $error;


    //创建一个套接字资源
    public function __construct()
    {
        #创建一个套接字(通讯节点)      协议,类型,具体协议
        $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        #给套接字绑定名字
        socket_bind($socket,$this->ip,$this->port);
        #监听套接字上的连接
        socket_listen($socket,3);//最大连接
        $this->socket = $socket;
        #建立客户端链接
        $this->listen_connect();
    }

    #监听是否有链接请求,并加入链接队列
    public function listen_connect()
    {
        #接收套接字的连接 (阻塞,等待客户端请求)
        $msgSocket = socket_accept($this->socket);
        #判断是否存在错误
        if($msgSocket == false)
        {
            if(!file_exists($this->error_src))
            {
                mkdir($this->error_src,0777,true);
            }
            $error = socket_strerror(socket_last_error());
            $error_data['error'] = urlencode('提示:'.iconv('gbk','utf-8',$error));
            $error_data['time'] = date('Y-m-d H:i:s',time());
            $error_str = urldecode(json_encode($error_data));
            file_put_contents($this->error_src.'/'.date('Y_m_d').'_error_log.txt','|'.$error_str,FILE_APPEND);
        }else
        {
            //$this->listen_connect[date('Y_m_d_H_i_s').mt_rand(10000,99999)] = $msgSocket;
            $this->listen_connect = $msgSocket;
            $this->remote_read();
        }
    }

    #读取客户端内容
    public function remote_read()
    {
        #判断套接字是否过期
        $connect_exceed = true;
        while ($connect_exceed)
        {
            #读取数组中列出的套接字将被监视,以查看字符是否可用于读取(更准确地说,是为了查看是否读到读不会阻塞——特别是,一个套接字资源也在文件结束时准备好,在这种情况下,一个socketread()将返回一个零长度的字符串
            $read[] = $this->listen_connect;
            #写入数组中列出的套接字将被监视,以查看写入是否会阻塞
            $white = [];
            #除数组中列出的套接字将被监视
            $except = [];
            #tvsec和tvusec一起构成了超时参数。超时是在socketselect()返回之前所花费的时间的上限。tvsec可能是零,导致socketselect()立即返回。这对于轮询很有用。如果tvsec为NULL(没有超时),socketselect()可以无限期地阻塞
            $tv_sec = 5;
            #读取客户端数据
            $this->read = socket_read($this->listen_connect,1024);
            $this->remote_white();
            #运行select()系统调用,该系统调用带有指定超时的套接字阵列
            $start = socket_select($read,$white,$except,$tv_sec);
            if($start)
            {
                file_put_contents($this->error_src.'/'.date('Y_m_d').'_error_log.txt','|'.json_encode($start),FILE_APPEND);
            }else
            {
                #关闭连接
                socket_close($this->listen_connect);
                $connect_exceed = false;
                $error = socket_strerror(socket_last_error());
                $error_data['error'] = urlencode('提示:'.iconv('gbk','utf-8',$error));
                $error_data['time'] = date('Y-m-d H:i:s',time());
                $error_str = urldecode(json_encode($error_data));
                $this->error = $error_str;
                file_put_contents($this->error_src.'/'.date('Y_m_d').'_error_log.txt','|'.$error_str,FILE_APPEND);
            }
        }
    }

    #回复客户端
    public function remote_white()
    {
        #向客户端写入数据
        if($this->white)
        {
            socket_write($this->listen_connect,$this->white,strlen($this->white));
        }
    }

    #读取客户端资源
    public function remote_res()
    {

    }

}


function p($val = '',$type= false)
{
    echo '<pre>';
    if($type||$val==false||@strlen($val)==1)
    {
        var_dump($val);
    }else
    {
        print_r($val);
    }
}


/**
 * serve_socket.php
 *
 * socket服务端
 *
 * 2017 Copyright (c) https://note.jsx6.com
 *
 * 修改历史
 * ----------------------------------------
 * 2015/10/17, 作者: 降省心(QQ:1348550820), 操作:创建
 **/


 
---------------------------------------------------------------------------------------------
不忘初心 方得始终!

唯有志存高远,方能风行天下。

道之所存,虽千万人吾往矣! 情之所钟,虽千万里吾念矣~

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。