6

別のブラウザー ウィンドウからの入力に基づいて、1 つのブラウザー ウィンドウを更新する必要がある状況があります。現在、私は WebSockets を使用しており、うまく機能しています。

ここで、ブラウザーの代わりに PHP を使用して WebSocket にデータを送信したいと考えています (したがって、ws:// の代わりに PHP コードを使用します)。つまり、JavaScript の代わりに PHP を使用して WebSocket.send() 呼び出しをシミュレートしたいと考えています。

動作していないように見える次のコードがあります (onmessage が呼び出されていません)。

if ( 
        function_exists('socket_create') AND
        $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) AND
        $sock_data = socket_connect($sock, "127.0.0.1", 12345)
    ) {  
        $msg = "hello world";
        $sock_data = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1); //Set 
        $sock_data = socket_write($sock, $msg, strlen($msg)); //Send data
        socket_close($sock); //Close socket
    } 
4

5 に答える 5

4

方法は次のとおりです。

http://permalink.gmane.org/gmane.comp.lang.javascript.nodejs/18088

$host = 'localhost';  //where is the websocket server
$port = 9000;
$local = "http://localhost/";  //url where this script run
$data = 'hello world!';  //data to be send

$head = "GET / HTTP/1.1"."\r\n".
            "Upgrade: WebSocket"."\r\n".
            "Connection: Upgrade"."\r\n".
            "Origin: $local"."\r\n".
            "Host: $host"."\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, "\x00$data\xff" ) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);  //receives the data included in the websocket package "\x00DATA\xff"
fclose($sock);
于 2011-04-19T13:47:58.160 に答える
1

ソケットにデータを送信するには、fsockopenを使用して、指定されたポートでソケットへの接続を開く必要があります。接続が成功した場合、あなたがする必要があるのはfwriteを使用することだけです

ただし、データをWebSocketサーバーに送信することになります。サーバーはユーザーをクライアントとして扱います。HTTPヘッダーを提供していないため、認証が成功することが期待されます。接続は拒否されます。

送信しようとしているメッセージを誰が受信するのか(すべてのユーザーまたは特定のユーザーまたはまったく異なるもの)を、目標が何であるかを知らずに言っていないため、これ以上何をすべきかを説明するのは困難です。

于 2011-04-19T14:07:27.157 に答える
-1

生データを TCP ソケットに送信するだけでなく、WebSocket にはさらに多くの機能があります。

まず、WebSocket が TCP を使用する UDP ソケットを使用しています。WebSockets は、HTTP に似た通信用の完全なプロトコルであるため、そのプロトコルに従う必要があります。最初に実行する必要があるハンドシェイク手順と、すべての通信に追加する必要があるヘッダーがあります。難しいことではありませんが、ここでは詳しく説明しません。

ここから 2 つのオプションがあります。PHP で WebSockets プロトコルを実装するか、次のようなビルド済みライブラリを使用します: http://code.google.com/p/phpwebsocket/

私は失礼でも意地悪でもありませんが、今後は Google で簡単に検索してみてください。私がリンクしたそのライブラリは、「PHP WebSockets」をグーグルで検索した後に見つかりました。

于 2011-04-19T01:45:07.633 に答える
-1

最も重要な部分は、既存のソケットでメッセージを送信する必要があることです。つまり、socket_connect、fsockopen、またはクライアントへの一方的な接続を試みる PHP 内のその他の関数を呼び出すことはできません。これは websocket のことではなく、ネットワーク プログラミングの基本的な概念です。

phpwebsocket では、次のようになります。

$msg = "hello world";
$phpwebsocket->send($user->socket, $msg);

ここで、'$phpwebsocket' は PHP WebSocket オブジェクト、$user->socket は javascript WebSocket() を使用して優先的に接続した接続ユーザー、send() は WebSocket オブジェクト内のメソッドで、メッセージを適切にフレーム (または、すぐに必要になるはずです)。

ただし、何らかの理由で PHP から Websocket を使用して Websocket サーバーに接続する場合は、https://github.com/nicokaiser/php-websocketを確認してください。現在のソリューションに満足している場合、リンク内のサーバーは重要ではありませんが、パッケージには必要な PHP Websocket クライアント クラスも含まれています。

于 2012-12-08T23:56:47.127 に答える