我做了个php socket客户端的长连接, 希望在其他页面能够调用这个客户端里面的send方法且不会重新创建一个socket而是能够找到之前已连接的socket。求各位大侠给点方案或解决的办法。谢谢!!!

解决方案 »

  1.   

    send的时候增加上一些人的标识,不久知道是那个人了,然后针对制定的人,完成对应的处理不就可以了。你要完全通过socket本身是没法实现的
      

  2.   

    我的Client.php文件是这样的<?php 
    class Client{ /**
     * IP地址
     */
    public static $ip = '127.0.0.1';
    /**
     * 端口号
     */
    public static $port = 7810;
    public static $sendtime = 0;
    public static $filepath = 'client_log.log';
    public static $socket;
    public static $conn;
    public static $bstatus = false;
    /**
     * 创建一个SOCKET
     * 建立SOCKET的连接
     */
    static function socket(){
    self::$socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP);
    if(self::$socket){
    fputs(fopen(self::$filepath,'a+'),"\r\nstart **r\n".date("y-m-d,H:i:s",time())." ".self::$socket." socket_create成功 \r\n");
    }else{
    fputs(fopen(self::$filepath,'a+'),date("y-m-d,H:i:s",time())."socket_create失败 \r\n");
    }
    self::$conn = socket_connect (self::$socket, self::$ip, self::$port);
    self::$bstatus = self::$conn?false:true;
    while(self::$bstatus){
    self::$conn = socket_connect (self::$socket, self::$ip, self::$port);
    self::$bstatus = self::$conn?false:true;
    }
    if(self::$conn){
    fputs(fopen(self::$filepath,'a+'),date("y-m-d,H:i:s",time())."socket_connect成功 \r\n");
    }else{/* 连接失败重启 */
    self::stop();
    self::socket();
    }
    }
    static function stop(){
    socket_close(self::$socket);
    socket_close(self::$conn);
    }
    /**
     * 每隔1分钟发送链路检测
     */
    static function sendCheck(){
    //如果此时间无数据发送就发送'0000'
    while(true){
    if((time() - self::$sendtime)>=60){
    self::send('0000');
    }else{
    set_time_limit(0);
    sleep(1);
    }
    }
    }
    static function send($data){
    $msg = $data;
    if(!self::$socket)self::socket();
    $write = socket_write(self::$socket,$msg,strlen($msg));
    if($write){
    self::$sendtime = time();
    fputs(fopen(self::$filepath,'a+'),date("y-m-d,H:i:s",time())."socket_write成功,数据为".$msg." \r\n");
    }else{
    fputs(fopen(self::$filepath,'a+'),date("y-m-d,H:i:s",time())."socket_write失败 \r\n");
    self::stop();
    self::socket();
    }
    }
    }
    ?>再其他页面是这样调用的
    include 'Client.php';
    function roadcheck(){
    Client::sendCheck();
    }
    //测试是为真实数据
    function toTest(){
    Client::send('02360000');
    }首先调用roadcheck方法,之后调用toTest方法,我希望服务端是能够读取到toTest方法发送的数据,而不是一直都是检测发送过来的数据
      

  3.   

    使用 socket 通讯是必须有监听的如果你只是想解决服务器端监听程序以外终止,客户端无法发送的问题
    可以在客户端发送数据之前通过其他端口发送建立连接的请求(比如80端口)
      

  4.   

    你的 sendCheck 中都死循环了,跟监听有什么区别
      

  5.   

    那也是,那我如何在其他页面调用toTest方法里面的Client的send会是之前已连接的socket而不是新建socket