2011-08-04 8 views
2

私はウェブソケットを初めて使っています。私は最初のウェブソケットを作ったので、今実行中に問題があります!ここphp websocket problem

はソケット

// set some variables 
$host = "127.0.0.1"; 
$port = 1234; 

// don't timeout! 
set_time_limit(0); 

// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n"); 
if($socket){ 
    echo "socket created .... $socket\n"; 
} 

// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); 
if($result){ 
    echo "socket binded ... $result\n"; 
} 
// start listening for connections 
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); 
if($result){ 
    echo "socket is now listening ... $result"; 
} 
// accept incoming connections 
// spawn another socket to handle communication 
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); 
if($spawn){ 
    echo $spawn."\n"; 
} 
// read client input 
$input = socket_read($spawn, 1024) or die("Could not read input\n"); 
if($input){ 
    echo $input."\n"; 
} 
// clean up input string 
$input = trim($input); 

// reverse client input and send back 
$output = strrev($input) . "\n"; 
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n"); 

// close sockets 
socket_close($spawn); 
socket_close($socket); 

のコードは、今どのように私はこのコードを実行することができています?私は、次のコードシェル私のXAMPPの上に書いた:

php htdocs/socket/server.php -q 

が、それが表示されます。

socket created....Resource id #4 
socket binded... 1 
socket is now listening...1 Resource is #5 
GET socket/server.php HTTP 1.1 
upgrade: WebSocket 
connection: Upgrade 
Host: http://localhost 
sec-WebSocket-key1: 14 53 8501 z4 5R' 
sec-WebSocket-key2: S 9\ 2s63, *[email protected] 

は今どのように私はそれを実行することができます...どのように私はそれに入力を送ることができますし、どのように私はJavaScriptでそれを使用することができます??

私はJavaScriptコードを作ったが、それは第二のために接続してから、外し...ここ

はjavasciptコードです:

$(document).ready(function() { 

if(!("WebSocket" in window)){ 
    $('#chatLog, input, button, #examples').fadeOut("fast");  
    $('<p>Oh no, you need a browser that supports WebSockets. How about <a href="http://www.google.com/chrome">Google Chrome</a>?</p>').appendTo('#container');  
}else{ 
    //The user has WebSockets 

connect(); 

function connect(){ 
     var socket; 
     var host = "ws://localhost:1234/websocket_source_files/myown.php"; 

     try{ 
      var socket = new WebSocket(host); 
      message('<p class="event">Socket Status: '+socket.readyState); 
      socket.onopen = function(){ 
       message('<p class="event">Socket Status: '+socket.readyState+' (open)');  
      } 

      socket.onmessage = function(msg){ 
       message('<p class="message">Received: '+msg.data);     
      } 

      socket.onclose = function(){ 
       message('<p class="event">Socket Status: '+socket.readyState+' (Closed)'); 
      }   

     } catch(exception){ 
      message('<p>Error'+exception); 
     } 

     function send(){ 
      var text = $('#text').val(); 
      if(text==""){ 
       message('<p class="warning">Please enter a message'); 
       return ;  
      } 
      try{ 
       socket.send(text); 
       message('<p class="event">Sent: '+text) 
      } catch(exception){ 
       message('<p class="warning">'); 
      } 
      $('#text').val(""); 
     } 

     function message(msg){ 
      $('#chatLog').append(msg+'</p>'); 
     }//End message() 

     $('#text').keypress(function(event) { 
        if (event.keyCode == '13') { 
        send(); 
        } 
     }); 

     $('#disconnect').click(function(){ 
      socket.close(); 
     }); 

    } 


}//End connect() 

}); 
</script> 

<title>WebSockets Client</title> 

</head> 
<body> 
<div id="wrapper"> 

<div id="container"> 

    <h1>WebSockets Client</h1> 

    <div id="chatLog"> 

    </div> 
    <p id="examples">e.g. try 'hi', 'name', 'age', 'today'</p> 

    <input id="text" type="text" /> 
    <button id="disconnect">Disconnect</button> 

</div> 

    </div> 
</body> 
</html>​ 

私はこのコードを実行する助けとウェブソケットを習得してください。..私は本当に私の学校のプロジェクトでそれらを使用する必要があります。

+0

これはクロームで動作非常に基本的なHTML(少なくとも私のもの)でありますそれを読んで... –

答えて

0

これに接続する別のPHPスクリプトを作成します。

+0

JavaScriptコードをチェック..それはソケットサーバーに接続しますが、理解できないものと解決できないものはなぜですか?シェル画面には何も表示されません!! – Awah

+0

質問の編集を確認してください – Awah

2

socket_accept -functionは、クライアントが接続するまでブロックします(待機します)。これが標準的な動作です。

しかし、ソケットを接続した後に実行する関数は、(あなたに指示しない限り)ブロックしません。だからあなたはスクリプトがSocketから読むことができるまで待つように指示したいでしょう。

これには、socket_set_block-functionが使用されます。また、socket_last_error-functionを使用してエラーが発生していないかどうかを確認することもできます。

でも、JavaやCはソケットを使うのに適していると思います。

0

あなたは本物の握手をしていません。

あなたが投稿するものから、あなたはこれが古いと廃止予定であるIETF-00の実装(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-00

を扱っている、最後の一つは(http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10)IETF-10をしているようです。あなたが必要と握手の

非常に基本的な説明はここで見つけることができます:http://en.wikipedia.org/wiki/WebSockets

(あなたがそこに新しいと公式の仕様へのリンクを見つけることができます)。

秒-のWebSocket-キー1と秒-のWebSocket-キー2フィールドとフィールドは、サーバが を構築するために使用するランダムなトークンがある後に8バイト :

あなたのケースでの重要な部分はこれですハンドシェークの最後に、クライアントのハンドシェイク を読み取ったことを証明するための16バイトのトークン。

ハンドシェイクは、 の最初のキーからの数字を連結し、スペースの数で割って構成されます。これは、次に、第2のキーについて、 と繰り返されます。 2つの結果の数値は、お互いに で連結され、フィールドの後ろの8バイトが連結されます。

最終結果は、連結された文字列のMD5合計です。[7] ハンドシェイクはHTTPのように見えますが、実際はそうではありません。それはサーバーに がハンドシェイク要求の一部をHTTPとして解釈してから WebSocketに切り替えます。一旦確立されると、WebSocketのデータフレームは、全二重モードでクライアントとサーバの間で に送り返すことができます。テキスト フレームは、全方向に同時に送信することができます。

データはわずか2バイトで最小限の額縁になっています。各フレームは、 を0x00バイトで開始し、0xFFバイトで終了し、その間に のUTF-8データを含みます。バイナリフレームはまだAPIではサポートされていません。 WebSocket テキストフレームはターミネータを使用し、バイナリフレームは長さ接頭辞を使用します。今

、いくつかのコード(これは、一つの接続を受け入れ、メッセージを受信し、それを行うことができる方法を示すためだけの非常に基本的な生の例のように、応答を送信します):

// Just to log to console 
function myLog($msg) 
{ 
    echo date('m/d/Y H:i:s ', time()) . $msg . "\n"; 
} 

// This will actually read and process the key-1 and key-2 variables, doing the math for them 
function getWebSocketKeyHash($key) 
{ 
    $digits = ''; 
    $spaces = 0; 
    // Get digits 
    preg_match_all('/([0-9])/', $key, $digits); 
    $digits = implode('', $digits[0]); 
    // Count spaces 
    $spaces = preg_match_all("/\\s/ ", $key, $dummySpaces); 
    $div = (int)$digits/(int)$spaces; 
    myLog('key |' . $key . '|: ' . $digits . '/' . $spaces . ' = ' . $div); 
    return (int)$div; 
} 

// This will read one header: value from the request header 
function getWebSocketHeader($buffer, &$lines, &$keys) 
{ 
    preg_match_all("/([a-zA-Z0-9\\-]*)(\\s)*:(\\s)*(.*)?\r\n/", $buffer, $headers); 
    $lines = explode("\r\n", $buffer); 
    $keys = array_combine($headers[1], $headers[4]); 
} 

// This is where the handshake gets done 
function handshake($peer) 
{ 
    $buffer = socket_read($peer, 4096, PHP_BINARY_READ); 
    socket_getpeername($peer, $address, $port); 
    $peerName = $address . ':' . $port; 
    myLog('Got from: ' . $peerName . ': ' . $buffer); 
    getWebSocketHeader($buffer, $lines, $keys); 
    if (!isset($keys['Sec-WebSocket-Key1']) || !isset($keys['Sec-WebSocket-Key2'])) { 
     myLog('Invalid websocket handshake for: ' . $peerName); 
     return; 
    } 
    $key1 = getWebSocketKeyHash($keys['Sec-WebSocket-Key1']); 
    $key2 = getWebSocketKeyHash($keys['Sec-WebSocket-Key2']); 
    $code = array_pop($lines); 
    // Process the result from both keys and form the response header 
    $key = pack('N', $key1) . pack('N', $key2) . $code; 
    myLog('1:|' . $key1 . '|- 2:|' . $key2 . '|3:|' . $code . '|4: ' . $key); 
    $response = "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"; 
    $response .= "Upgrade: WebSocket\r\n"; 
    $response .= "Connection: Upgrade\r\n"; 
    $response .= "Sec-WebSocket-Origin: " . trim($keys['Origin']) . "\r\n"; 
    $response .= "Sec-WebSocket-Location: ws://" . trim($keys['Host']) . "/\r\n"; 
    $response .= "\r\n" . md5($key, true); // this is the actual response including the hash of the result of processing both keys 
    myLog($response); 
    socket_write($peer, $response); 
} 

// This is where you can send a frame (delimited by 0x00 and 0xFF) 
function send($peer, $message) 
{ 
    socket_write($peer, pack('c', (int)0) . utf8_encode($message) . pack('c', (int)255)); 
} 

// This is where you receive a frame (delimited again by 0x00 and 0xFF) 
function receive($peer) 
{ 
    $buffer = socket_read($peer, 4096, PHP_BINARY_READ); 
    if (empty($buffer)) { 
     myLog('Error receiving from peer'); 
     return; 
    } 
    return substr($buffer, 1, -1); 
} 

// Now create a socket 
$socket = socket_create_listen(1026); 
$peer = socket_accept($socket); 

// Do the handshake and wait for an incoming message from the client 
handshake($peer); 
myLog('Got ' . receive($peer)); 

// Respond! 
send($peer, 'hi there'); 
socket_close($peer); 
socket_close($socket); 

EDIT:私たちが交流をすることができますので、適切な形式にあなたのポストを編集・ツールを使用し

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
function WebSocketTest() 
{ 
    if ("WebSocket" in window) 
    { 
    // Let us open a web socket 
    var ws = new WebSocket("ws://host:1026"); 
    ws.onopen = function() 
    { 
     // Web Socket is connected, send data using send() 
     ws.send("Message to send"); 
     console.log('send'); 
    }; 
    ws.onmessage = function (evt) 
    { 
     var received_msg = evt.data; 
     console.log(received_msg); 
     var txt = document.createTextNode(received_msg); 
     document.getElementById('messages').appendChild(txt); 
    }; 
    ws.onclose = function() 
    { 
     // websocket is closed. 
     console.log('close'); 
    }; 
    } 
    else 
    { 
    // The browser doesn't support WebSocket 
    alert("WebSocket NOT supported by your Browser!"); 
    } 
} 
</script> 
</head> 
<body> 
<div id="sse"> 
    <a href="javascript:WebSocketTest()">Run WebSocket</a> 
</div> 
<div id="messages"> 
</div> 
</body> 
</html>