3
中循環,如果套接字按原樣響應,它會爲每個客戶端顯示「resource id#23」etc etc等不同的資源,但是當調用socket_write函數來寫入每個循環中都有相同的回顯消息,寫入功能失敗,並且只有一個客戶端獲得寫入消息(如果您提供輸入並提交,則會顯示一個輸入框,它會轉到套接字服務器併爲所有客戶端寫入d消息)當循環客戶端套接字數組時,無法在php套接字
<form method='GET' action="">
<input type='text' name='name' />
<input type='submit' />
</form>
<?php
$no=500;$n=0;
$sock=null;
if(!($sock=socket_create(AF_INET,SOCK_STREAM,0)))
{
$code=socket_last_error();
$msg=socket_strerror($code);
die("ERROR $msg");
}
echo "Socket created $sock";
/*
$sock1=socket_create(AF_INET,SOCK_STREAM,0);
socket_set_option($sock1, SOL_SOCKET, SO_REUSEADDR, 1)
socket_connect($sock1,'localhost',9001);
if(sizeof($_GET)>0)
{
$msg=$_GET['name'];
if(!socket_send($sock1,$msg,strlen($msg),0))
{
$err=socket_last_error();
$emessg=socket_strerror($err);
die("ERROR $emessg");
}
}
*/
if (!socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1)) {
echo socket_strerror(socket_last_error($sock));
exit;
}
if(!socket_bind($sock, "127.0.0.1" , 9001))
{
$cod=socket_last_error();
$msg=socket_strerror($cod);
die("ERROR:$msg");
}
echo "Socket BOund";
if(!socket_listen($sock,10))
{
$cod=socket_last_error();
$msg=socket_strerror($cod);
die("ERROR:$msg");
}
echo "Socket listen OK \n";
class clients{
public $addr=null,$portc=null,$soc=null;
function __construct($sock1) {
/*if(!($client[$n]=socket_create(AF_INET,SOCK_STREAM,0)))
{
$code=socket_last_error();
$msg=socket_strerror($code);
die("ERROR $msg");
}*/
$this->soc=$sock1;
if(socket_getpeername($this->soc,$address,$port))
{
echo "$address in port $port";
$this->addr=$address;
$this->portc=$port;
}
}
function sock(){return $this->soc;}
}//$client[500];
$client=array();
while(true){
//$client[$n++]=socket_accept($sock);
if($clienttemp=socket_accept($sock))
{
$client[$n]=new clients($clienttemp);
echo "NEw client ".$client[$n]->addr;
$n++;
//var_dump($client[$n-1]);
}
for($j=0;$j<$n;$j++)
//if($input=socket_read($client[$n-1]->soc,1024))
if($input=socket_read($client[$j]->soc,1024))
{
//$resp="<br/>****".$client[$n-1]->addr." says: $input*****";
$resp="<br/>****".$client[$j]->addr." says: $input*****";
if($input=='quit')break;
for($i=0;$i<$n;$i++)
{
socket_write($client[$i]->soc,$resp);
echo "****</br>$resp".$client[$i]->soc."****</br>";
}
}
// TO write in all clients
}
socket_close($client[$n-1]->soc);
socket_close($sock);
?>
你在做什麼,你的問題是什麼? – Sjoerd
應顯示即在所有客戶端寫消息 –
如果您縮進並格式化代碼,它可能會有所幫助。我認爲你的問題在於:for($ j = 0; $ j <$ n; $ j ++),因爲for循環沒有開頭accolade({)。但是有點難以用這種混亂的代碼來說明.. – Johan