while(true){
$changed = $this->sockets;
$write=NULL;
$except=NULL;
socket_select($changed,$write,$except,NULL);
foreach($changed as $socket){
if($socket==$this->master){
$client=socket_accept($this->master);
if($client<0){ $this->log("socket_accept() failed"); continue; }
else{ $this->connect($client); }
}
else{
/*if(1=1){
$user = $this->getuserbysocket($socket);
if(!$user->handshake){ $this->dohandshake($user,$buffer);}
$this->process($user,$this->unwrap($buffer));
}*/
$bytes = @socket_recv($socket,$buffer,2048,0);
if($bytes==0){ $this->disconnect($socket); }
else{
$user = $this->getuserbysocket($socket);
if(!$user->handshake){ $this->dohandshake($user,$buffer);}
else{ $this->process($user,$this->unwrap($buffer));}
}
}
}
}
上面的代码,是phpwebsocket的一个示例,while是在构造函数里面的。原来的示例,是客户端连接后,服务端一直监听,如果有消息,就处理后返回。现在我想改成,当某种条件成立时,服务端主动向客户端发信息。我把$bytes=@socket 。。 $this->process($user,$this->unwrap($buffer));} 这段代码换成注释部分,可一直连接不上。希望高手们帮帮忙
$changed = $this->sockets;
$write=NULL;
$except=NULL;
socket_select($changed,$write,$except,NULL);
foreach($changed as $socket){
if($socket==$this->master){
$client=socket_accept($this->master);
if($client<0){ $this->log("socket_accept() failed"); continue; }
else{ $this->connect($client); }
}
else{
/*if(1=1){
$user = $this->getuserbysocket($socket);
if(!$user->handshake){ $this->dohandshake($user,$buffer);}
$this->process($user,$this->unwrap($buffer));
}*/
$bytes = @socket_recv($socket,$buffer,2048,0);
if($bytes==0){ $this->disconnect($socket); }
else{
$user = $this->getuserbysocket($socket);
if(!$user->handshake){ $this->dohandshake($user,$buffer);}
else{ $this->process($user,$this->unwrap($buffer));}
}
}
}
}
上面的代码,是phpwebsocket的一个示例,while是在构造函数里面的。原来的示例,是客户端连接后,服务端一直监听,如果有消息,就处理后返回。现在我想改成,当某种条件成立时,服务端主动向客户端发信息。我把$bytes=@socket 。。 $this->process($user,$this->unwrap($buffer));} 这段代码换成注释部分,可一直连接不上。希望高手们帮帮忙
socket服务器端程序不同,客户端也要不同的的
一般情况下是client pull,你要实现server push,客户端要写成主动接收才行(一般情况下只是被动接收,先发后收)
我的思路是这样的,服务端还是一直保持不变,但服务器上多执行一个程序(一直WHILE的),但条件成立时,就向服务端发信息,服务端收到后,就处理完广播给其他所有人。这样子得开两个程序,而且还有很多麻烦的地方,比如服务端收到信息,还要判断是不是一直WHILE的那个客户端等等。是否有其他更好的思路?
$bytes = @socket_recv($socket,$buffer,2048,0);
if($bytes==0){ $this->disconnect($socket); }
else{
$user = $this->getuserbysocket($socket);
if(!$user->handshake){ $this->dohandshake($user,$buffer);while(true){if(条件是否成立){主动向客户端发数据}sleep(3);}}
else{ $this->process($user,$this->unwrap($buffer));}
这样子,条件成立的时候,服务端可以向客户端发信息。只是其他人连不上,断开的服务端也不知道
你想实现的服务是可以的不过要用命令行启动类似一个服务 客户端通过IP和端口来访问 服务端脚本是要不断监听是否有客户端连接进来 或者是要推送信息到客户端
单线程是可以的,其他语言也有单线程的实例,问题应该出在其他方面
单线程一般要用异步,select就是异步,但我不太熟悉服务器端的编程(暂时还没接触)
不能一直占用,完成一个发送或接收就要交出控制权,异步机制一般不需要while的,while只用来完成一个send或者recv,异步是通过判断可读或可写触发读、写(收发)要注意
$bytes = @socket_recv($socket,$buffer,2048,0);
if($bytes==0){ $this->disconnect($socket); }
这个逻辑是没有接收就断开了(长连接不应随便断开),socket有很多逻辑要认真考虑的,你目前代码还没涉及socket err的情况,那里的逻辑更多更复杂;现在光看socket文档所说的错误号就有几十个,越写越背脊发凉……客户端我还能说点具体的,最近有在写,服务器端抱歉我只能说理论知识
socket 是实现 tcp/ip 协议的工具包,他集成了 tcp、udp 通讯的所有功能
其中 tcp 是点对点通讯,udp 是广播通讯
在无职守的通讯网络中
主叫方通过 udp 将目标请求广播出去并监听应答端口
被叫方(如果在线)鉴别到是呼叫自己时,通过 udp 或 tcp 发出回应
主叫方收到回应后,协同被叫方创建 tcp 通讯通道。然后进行双向点对点通讯
在有职守的通讯网络中
主叫方向职守(服务器)通过 tcp 发送请求
职守向被叫方通过 tcp 转发呼叫
被叫方(如果在线)收到呼叫后,通过 tcp 发出回应
主叫方收到回应后
1、可以继续通过职守进行与被叫方的通讯
2、可以直接建立与被叫方的双向通讯于是,只要你的程序能够满足实现通讯所需的条件,就能正常工作
如果你要问的是socket 我觉得你还是别纠结了 去网上找个DEMO很多的 看下别人的代码你应该就能明白了 如果看不懂别人的代码 说明你还有好多需要修炼 建议从基础开始如果是多线程 php不支持多线程 你具体要实现个啥?
http://code.google.com/p/phpwebsocket/