简体   繁体   中英

php store data in socket

I would like to know, how do you store date in socket stream ?

I'm learning php socket atm, and for example, if i want to make an online users list : People on the webpage have a session[username]. I want to link it to the IP address in socket clients list.

I don't want to get the session_id of the client in socket page, i would like to send the username to that socket page (via javascript socket.onopen) and then the username would be stored until connection end.

Is that possible ?

EDIT

/* SERVER DATA
=======================================================*/
$host = '127.0.0.1'; //host
$port = '8090'; //port
$null = NULL; //null var

//Create TCP/IP, IPv4 stream 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 listening socket to the list
$clients = array($socket);

//Start endless loop, so that our script doesn't stop
while (true) {
    //Manage multiple connections
    $changed = $clients;

    //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
        $clients[] = $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_user_conn', 'message'=>$ip))); //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]);
    }

    //loop through all connected sockets
    foreach ($changed as $changed_socket) { 

        //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 
            $user_name = $tst_msg->name; //sender name
            $user_message = $tst_msg->message; //message text

            //prepare data to be sent to client
            $response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message)));
            send_message($response_text); //send data
            break 2; //exist this loop
        }

        $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ);
        if ($buf === false) { // check disconnected client
            // remove client for $clients array
            $found_socket = array_search($changed_socket, $clients);
            socket_getpeername($changed_socket, $ip);
            unset($clients[$found_socket]);

            //notify all users about disconnected connection
            $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected')));
            send_message($response);
        }
    }
}
// close the listening socket
socket_close($socket);

function send_message($msg)
{
    global $clients;
    foreach($clients as $changed_socket)
    {
        @socket_write($changed_socket,$msg,strlen($msg));
    }
    return true;
}


//Unmask incoming framed message
function unmask($text) {
    $length = ord($text[1]) & 127;
    if($length == 126) {
        $masks = substr($text, 4, 4);
        $data = substr($text, 8);
    }
    elseif($length == 127) {
        $masks = substr($text, 10, 4);
        $data = substr($text, 14);
    }
    else {
        $masks = substr($text, 2, 4);
        $data = substr($text, 6);
    }
    $text = "";
    for ($i = 0; $i < strlen($data); ++$i) {
        $text .= $data[$i] ^ $masks[$i%4];
    }
    return $text;
}

//Encode message for transfer to client.
function mask($text)
{
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCn', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCNN', $b1, 127, $length);
    return $header.$text;
}

//handshake new client.
function perform_handshaking($receved_header,$client_conn, $host, $port)
{
    $headers = array();
    $lines = preg_split("/\r\n/", $receved_header);
    foreach($lines as $line)
    {
        $line = chop($line);
        if(preg_match('/\A(\S+): (.*)\z/', $line, $matches))
        {
            $headers[$matches[1]] = $matches[2];
        }
    }

    $secKey = $headers['Sec-WebSocket-Key'];
    $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
    //hand shaking header
    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "WebSocket-Origin: $host\r\n" .
    "WebSocket-Location: ws://$host:$port/demo/shout.php\r\n".
    "Sec-WebSocket-Accept:$secAccept\r\n\r\n";
    socket_write($client_conn,$upgrade,strlen($upgrade));
}

I would like to send 'message'=>$username. At this line :

$response = mask(json_encode(array('type'=>'system_user_conn', 'message'=>$ip))); //prepare json data

When i'm using on send data (javascript), i re-send the username all the time, like this :

$('#frmChat').on("submit",function(event){
                event.preventDefault();
                var messageJSON = {
                    type: 'usrmsg',
                    name: '<?php echo $SESSION['pseudo']; ?>',
                    message: $('#chat-message').val()
                };
                websocket.send(JSON.stringify(messageJSON));
            });

I'm looking for a way to store the username. Not to re-send it all the time. It will help me to create an "online users" list.

Thank you in advance.

Why would you do that? You can just use the PHP Session Variable to check if a user is logged in. You can specify the time a session will be stored in the PHP configuration. You can also remove the session if needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM