title: PHP client Web socket to send messages
body: <p>I have following code</p>
  
  <p><strong>index.php</strong></p>
  
  <pre><code>&lt;!DOCTYPE html&gt;
  &lt;html&gt;
  &lt;head&gt;
  &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
  &lt;style type="text/css"&gt;
  
  .panel{
  
  
  margin-right: 3px;
  }
  
  .button {
      background-color: #4CAF50;
      border: none;
      color: white;
      margin-right: 30%;   
      margin-left: 30%;
      text-decoration: none;
      display: block;
      font-size: 16px;
      cursor: pointer;
      width:30%;
      height:40px;
      margin-top: 5px;
  
  }
  input[type=text]{
          width:100%;
          margin-top:5px;
  
      }
  
  
  .chat_wrapper {
      width: 70%;
      height:472px;
      margin-right: auto;
      margin-left: auto;
      background: #3B5998;
      border: 1px solid #999999;
      padding: 10px;
      font: 14px 'lucida grande',tahoma,verdana,arial,sans-serif;
  }
  .chat_wrapper .message_box {
      background: #F7F7F7;
      height:350px;
          overflow: auto;
      padding: 10px 10px 20px 10px;
      border: 1px solid #999999;
  }
  .chat_wrapper  input{
      //padding: 2px 2px 2px 5px;
  }
  .system_msg{color: #BDBDBD;font-style: italic;}
  .user_name{font-weight:bold;}
  .user_message{color: #88B6E0;}
  
  @media only screen and (max-width: 720px) {
      /* For mobile phones: */
      .chat_wrapper {
          width: 95%;
      height: 40%;
      }
  
  
      .button{ width:100%;
      margin-right:auto;   
      margin-left:auto;
      height:40px;}
  
  
  
  
  
  
  }
  
  &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;  
  &lt;?php 
  $colours = array('007AFF','FF7000','FF7000','15E25F','CFC700','CFC700','CF1100','CF00BE','F00');
  $user_colour = array_rand($colours);
  ?&gt;
  
  
  &lt;script src="jquery-3.1.1.js"&gt;&lt;/script&gt;
  
  
  &lt;script language="javascript" type="text/javascript"&gt;  
  $(document).ready(function(){
      //create a new WebSocket object.
      var wsUri = "ws://localhost:9000/demo/server.php";  
      websocket = new WebSocket(wsUri); 
  
      websocket.onopen = function(ev) { // connection is open 
          $('#message_box').append("&lt;div class=\"system_msg\"&gt;Connected!&lt;/div&gt;"); //notify user
      }
  
      $('#send-btn').click(function(){ //use clicks message send button   
          var mymessage = $('#message').val(); //get message text
          var myname = $('#name').val(); //get user name
  
          if(myname == ""){ //empty name?
              alert("Enter your Name please!");
              return;
          }
          if(mymessage == ""){ //emtpy message?
              alert("Enter Some message Please!");
              return;
          }
          document.getElementById("name").style.visibility = "hidden";
  
          var objDiv = document.getElementById("message_box");
          objDiv.scrollTop = objDiv.scrollHeight;
          //prepare json data
          var msg = {
          message: mymessage,
          name: myname,
          color : '&lt;?php echo $colours[$user_colour]; ?&gt;'
          };
          //convert and send data to server
          websocket.send(JSON.stringify(msg));
      });
  
      //#### Message received from server?
      websocket.onmessage = function(ev) {
          var msg = JSON.parse(ev.data); //PHP sends Json data
          var type = msg.type; //message type
          var umsg = msg.message; //message text
          var uname = msg.name; //user name
          var ucolor = msg.color; //color
  
          if(type == 'usermsg') 
          {
              $('#message_box').append("&lt;div&gt;&lt;span class=\"user_name\" style=\"color:#"+ucolor+"\"&gt;"+uname+"&lt;/span&gt; : &lt;span class=\"user_message\"&gt;"+umsg+"&lt;/span&gt;&lt;/div&gt;");
          }
          if(type == 'system')
          {
              $('#message_box').append("&lt;div class=\"system_msg\"&gt;"+umsg+"&lt;/div&gt;");
          }
  
          $('#message').val(''); //reset text
  
          var objDiv = document.getElementById("message_box");
          objDiv.scrollTop = objDiv.scrollHeight;
      };
  
      websocket.onerror   = function(ev){$('#message_box').append("&lt;div class=\"system_error\"&gt;Error Occurred - "+ev.data+"&lt;/div&gt;");}; 
      websocket.onclose   = function(ev){$('#message_box').append("&lt;div class=\"system_msg\"&gt;Connection Closed&lt;/div&gt;");}; 
  });
  
  
  
  
  &lt;/script&gt;
  &lt;div class="chat_wrapper"&gt;
  &lt;div class="message_box" id="message_box"&gt;&lt;/div&gt;
  &lt;div class="panel"&gt;
  &lt;input type="text" name="name" id="name" placeholder="Your Name" maxlength="15" /&gt;
  
  &lt;input type="text" name="message" id="message" placeholder="Message" maxlength="80" 
  onkeydown = "if (event.keyCode == 13)document.getElementById('send-btn').click()"  /&gt;
  
  
  
  
  
  &lt;/div&gt;
  
  &lt;button id="send-btn" class=button&gt;Send&lt;/button&gt;
  
  &lt;/div&gt;
  
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p><strong>server.php</strong></p>
  
  <pre><code>&lt;?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 &amp; add listning socket to the list
  $clients = array($socket);
  
  //start endless loop, so that our script doesn't stop
  while (true) {
      //manage multipal 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); //accpet 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'=&gt;'system', 'message'=&gt;$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 incomming data
          while(socket_recv($changed_socket, $buf, 1024, 0) &gt;= 1)
          {
              $received_text = unmask($buf); //unmask data
              $tst_msg = json_decode($received_text); //json decode 
              $user_name = $tst_msg-&gt;name; //sender name
              $user_message = $tst_msg-&gt;message; //message text
              $user_color = $tst_msg-&gt;color; //color
  
              //prepare data to be sent to client
              $response_text = mask(json_encode(array('type'=&gt;'usermsg', 'name'=&gt;$user_name, 'message'=&gt;$user_message, 'color'=&gt;$user_color)));
              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'=&gt;'system', 'message'=&gt;$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]) &amp; 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 &lt; strlen($data); ++$i) {
          $text .= $data[$i] ^ $masks[$i%4];
      }
      return $text;
  }
  
  //Encode message for transfer to client.
  function mask($text)
  {
      $b1 = 0x80 | (0x1 &amp; 0x0f);
      $length = strlen($text);
  
      if($length &lt;= 125)
          $header = pack('CC', $b1, $length);
      elseif($length &gt; 125 &amp;&amp; $length &lt; 65536)
          $header = pack('CCn', $b1, 126, $length);
      elseif($length &gt;= 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));
  }
  </code></pre>
  
  <p>The above code is working fine.But now i am looking for client side as php .can any provide me some example to make client websocket using php</p>
  
  <p><strong>UPDATES</strong></p>
  
  <p>I need to send byte array using php or javascript library through websocket  </p>
  
  <p><strong>Update 2</strong>
  I have found simple class of websocket but dont know how to use</p>
  
  <p><a href="https://github.com/paragi/PHP-websocket-client/blob/master/websocket_client.php" rel="noreferrer">https://github.com/paragi/PHP-websocket-client/blob/master/websocket_client.php</a></p>
  
  <p>Also as per Niket Pathak answer i tried but getting following error</p>
  
  <pre><code>&lt;?php
  $host = 'ws://echo.websocket.org';  // your websocket server
  $port = 80;
  $local = "http://localhost";  // url where this script run | Client
  $data = '{"id": 2,"command": "server_info"}';  // data to be sent
  
  $head = "GET / HTTP/1.1"."\r\n".
          "Upgrade: WebSocket"."\r\n".
          "Connection: Upgrade"."\r\n".
          "Origin: $local"."\r\n".
          "Host: $host"."\r\n".
          "Sec-WebSocket-Version: 13"."\r\n".
          "Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
          "Content-Length: ".strlen($data)."\r\n"."\r\n";
  // WebSocket handshake
  $sock = fsockopen($host, $port, $errno, $errstr, 2);
  fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
  $headers = fread($sock, 2000);
  fwrite($sock, hybi10Encode($data)) or die('error:'.$errno.':'.$errstr);
  $wsdata = fread($sock, 2000);
  fclose($sock);
  
  var_dump(hybi10Decode($wsdata));
  
  // hibi10 decoding of data
  function hybi10Decode($data)
  {
      $bytes = $data;
      $dataLength = '';
      $mask = '';
      $coded_data = '';
      $decodedData = '';
      $secondByte = sprintf('%08b', ord($bytes[1]));
      $masked = ($secondByte[0] == '1') ? true : false;
      $dataLength = ($masked === true) ? ord($bytes[1]) &amp; 127 : ord($bytes[1]);
      if($masked === true)
      {
          if ($dataLength === 126) {
             $mask = substr($bytes, 4, 4);
             $coded_data = substr($bytes, 8);
          }
          elseif ($dataLength === 127) {
              $mask = substr($bytes, 10, 4);
              $coded_data = substr($bytes, 14);
          }
          else {
              $mask = substr($bytes, 2, 4);       
              $coded_data = substr($bytes, 6);        
          }   
          for ($i = 0; $i &lt; strlen($coded_data); $i++) {       
              $decodedData .= $coded_data[$i] ^ $mask[$i % 4];
          }
      }
      else {
          if ($dataLength === 126) {          
             $decodedData = substr($bytes, 4);
          }
          elseif ($dataLength === 127) {           
              $decodedData = substr($bytes, 10);
          } 
          else {               
              $decodedData = substr($bytes, 2);       
          }       
      }   
  
      return $decodedData;
  }
  
  // hibi10 encoding of data
  function hybi10Encode($payload, $type = 'text', $masked = true) {
      $frameHead = array();
      $frame = '';
      $payloadLength = strlen($payload);
  
      switch ($type) {
          case 'text':
              // first byte indicates FIN, Text-Frame (10000001):
              $frameHead[0] = 129;
              break;
          case 'close':
              // first byte indicates FIN, Close Frame(10001000):
              $frameHead[0] = 136;
              break;
          case 'ping':
              // first byte indicates FIN, Ping frame (10001001):
              $frameHead[0] = 137;
              break;
          case 'pong':
              // first byte indicates FIN, Pong frame (10001010):
              $frameHead[0] = 138;
              break;
       }
  
      // set mask and payload length (using 1, 3 or 9 bytes)
      if ($payloadLength &gt; 65535) {
          $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
          $frameHead[1] = ($masked === true) ? 255 : 127;
          for ($i = 0; $i &lt; 8; $i++) {
              $frameHead[$i + 2] = bindec($payloadLengthBin[$i]);
          }
  
          // most significant bit MUST be 0 (close connection if frame too big)
          if ($frameHead[2] &gt; 127) {
              $this-&gt;close(1004);
              return false;
          }
      } elseif ($payloadLength &gt; 125) {
          $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
          $frameHead[1] = ($masked === true) ? 254 : 126;
          $frameHead[2] = bindec($payloadLengthBin[0]);
          $frameHead[3] = bindec($payloadLengthBin[1]);
      } else {
          $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
      }
  
      // convert frame-head to string:
      foreach (array_keys($frameHead) as $i) {
          $frameHead[$i] = chr($frameHead[$i]);
      }
      if ($masked === true) {
          // generate a random mask:
          $mask = array();
          for ($i = 0; $i &lt; 4; $i++) {
              $mask[$i] = chr(rand(0, 255));
          }
          $frameHead = array_merge($frameHead, $mask);
      }
      $frame = implode('', $frameHead);
      // append payload to frame:
      for ($i = 0; $i &lt; $payloadLength; $i++) {
          $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
      }
  
      return $frame;
  }
  </code></pre>
  
  <p>Error</p>
  
  <blockquote>
    <p>Warning: fsockopen(): unable to connect to ws://echo.websocket.org:80
    (Unable to find the socket transport "ws" - did you forget to enable
    it when you configured PHP?) in G:\XAMPP\htdocs\a\server.php on line
    16</p>
    
    <p>Warning: fwrite() expects parameter 1 to be resource, boolean given in
    G:\XAMPP\htdocs\a\server.php on line 17 error:407024:Unable to find
    the socket transport "ws" - did you forget to enable it when you
    configured PHP?</p>
  </blockquote>