php socket 客户端长连接 我做了个php socket客户端的长连接, 希望在其他页面能够调用这个客户端里面的send方法且不会重新创建一个socket而是能够找到之前已连接的socket。求各位大侠给点方案或解决的办法。谢谢!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 send的时候增加上一些人的标识,不久知道是那个人了,然后针对制定的人,完成对应的处理不就可以了。你要完全通过socket本身是没法实现的 我的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方法发送的数据,而不是一直都是检测发送过来的数据 使用 socket 通讯是必须有监听的如果你只是想解决服务器端监听程序以外终止,客户端无法发送的问题可以在客户端发送数据之前通过其他端口发送建立连接的请求(比如80端口) 你的 sendCheck 中都死循环了,跟监听有什么区别 那也是,那我如何在其他页面调用toTest方法里面的Client的send会是之前已连接的socket而不是新建socket 求助php正则 关于一个简单的sql语句,和搜索条件有关的 php定时程序,ignore_user_abort(true);set_time_limit(0); 找一个D3D程序员为何这么难找 老问题 本机测试无问题上传后无法写入数据库 高手帮看 怎样安装MYSQLI 关于一个EMAIL发送错误 紧急:apache+php+oracle升级连不上来 的用户密码提交之后的处理页怎么用IE的后退键返回不不过去呢 如何发送多媒体邮件? 大家看下我的这句PHP查询语句出现什么毛病? 请教关于XML报文的问题
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方法发送的数据,而不是一直都是检测发送过来的数据
可以在客户端发送数据之前通过其他端口发送建立连接的请求(比如80端口)