2014-09-05 72 views
2

我試圖用WebSocket(JS + PHP)建立一個網站,我想從發件人獲取套接字。例如,如果客戶端'A'向我的服務器發送消息,如何從客戶端'A'獲取套接字。 我在谷歌搜索,但我發現唯一的事情是,socket_select等待通信,並返回套接字數量的變化,但我無法得到套接字本身。如何識別發件人從websocket(PHP)

我的PHP代碼如下

<?php 

$host = 'localhost'; //host 
$port = '9000'; //port 
$null = NULL; //null var 
//Create TCP/IP sream socket 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
//reuseable port 
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); 

//bind socket to specified host 
socket_bind($socket, 0, $port); 

//listen to port 
socket_listen($socket); 

//create & add listning socket to the list 
$sockets = array($socket); 
$users = array(); 

$validActions = array('init'); 

//start endless loop, so that our script doesn't stop 
while (true) { 
    //manage multipal connections 
    $changed = $sockets; 
    //returns the socket resources in $changed array 
    socket_select($changed, $null, $null, 0, 10); 

    //check for new socket 
    if (in_array($socket, $changed)) { 
     $socket_new = socket_accept($socket); //accept new socket 
     $sockets[] = $socket_new; //add socket to client array 

     $header = socket_read($socket_new, 1024); //read data sent by the socket 
     perform_handshaking($header, $socket_new, $host, $port); //perform websocket handshake 

     socket_getpeername($socket_new, $ip); //get ip address of connected socket 
     $response = mask(json_encode(array('type' => 'system', 'message' => $ip . ' connected'))); //prepare json data 
     send_message($response); //notify all users about new connection 
     //make room for new socket 
     $found_socket = array_search($socket, $changed); 
     unset($changed[$found_socket]); 
    } 

    $received_text = unmask($buf); //unmask data 
    $received_msg = json_decode($received_text); //json decode 


    //check for any incomming data 
    while (socket_recv($changed_socket, $buf, 1024, 0) >= 1) { 
     $received_text = unmask($buf); //unmask data 
     $tst_msg = json_decode($received_text); //json decode 
     // I HAVE TO GIVE $socket FROM THE CLIENT TO THE process() FUNCTION 
     process($received_msg); 
     ... MORE CODE .... 
    } 
} 
// close the listening socket 
socket_close($sock); 
+0

我發現我可以從與socket_accept連接的客戶端套接字,但之後有沒有辦法從發件人後套接字? – X4V18 2014-09-05 13:33:03

回答

0

我認爲我必須使用socket_select,我讀過的文件,但我仍然沒有找到合適的方法,從一個發送者獲得插座消息...