First you need to run server script "server.php". You can do using command prompt. Open cmd and navigate to project folder and type "php -q server.php" or browse from browser, server started. Now browse "index.php" from browser and start chatting. |
One thing need to do before start server, have to check if socket is enabled in your server. Navigate to your PHP installation folder and find and edit "php.ini" file. Find the text php_sockets.dll and uncomment the line. And restart your apache server. |
Below is full server.php script |
<?php $host = 'localhost'; //host $port = '9000'; //port $null = NULL; //null var //Create TCP/IP stream socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //reusable 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); echo "Server Started...\n"; set_time_limit(60 * 2); //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)) { echo "Client Connected...\n"; $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 web-socket 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]); } //loop through all connected sockets foreach ($changed as $changed_socket) { //check for any incoming data try { while (socket_recv($changed_socket, $buf, 1024, 0) >= 1) { try { $received_text = unmask($buf); //unmask data if($received_text != $null) { $tst_msg = json_decode($received_text); //json decode $user_name = $tst_msg->name; //sender name $user_message = $tst_msg->message; //message text $user_color = $tst_msg->color; //color //prepare data to be sent to client $response_text = mask(json_encode( array('type' => 'user_message', 'name' => $user_name, 'message' => $user_message, 'color' => $user_color) )); send_message($response_text); //send data } } catch(Exception $ex) { echo "Exception_2=" . $ex->getMessage() . "\n"; } break 2; //exist this loop } } catch(Exception $ex) { echo "Exception=" . $ex->getMessage() . "\n"; } $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; $end_check = ord($text[0]) & 0x0F; 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]; } if($end_check == 8) { echo "Client Disconnected...\n"; return null; } 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" . "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; socket_write($client_conn, $upgrade, strlen($upgrade)); } ?> |
Download full example from here |
Showing posts with label WebSocket. Show all posts
Showing posts with label WebSocket. Show all posts
Saturday, December 10, 2016
Simple Chat Application Using PHP & WebSocket
Subscribe to:
Posts (Atom)