2016-07-20 26 views
2

私はラチェットWebSocketServerをバックエンドで実行していますが、これは問題なく動作しています。PHPを使用してラチェットwebsocketサーバーに接続

<?php 

require '../vendor/autoload.php'; 

use Ratchet\WebSocket\WsServer; 
use Ratchet\Http\HttpServer; 

$wsServer = new WsServer(new Chat()); 
$wsServer->disableVersion(0); 

$server = \Ratchet\Server\IoServer::factory(
    new HttpServer(
     $wsServer 
    ), 
    8080 
); 

$server->run(); 

しかし、プレーンなPHPスクリプトを使用してwebsocketに接続して、サーバーにメッセージを送信したいとします。

$host = 'ws://localhost'; //where is the websocket server 
$port = 8080; 
$local = "http://example.com"; //url where this script run 
$data = "first message"; //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:$port"."\r\n". 
    "Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n". 
    "Content-Length: ".strlen($data)."\r\n"."\r\n"; 

//WebSocket handshake 
$sock = fsockopen($host, $port); 
fwrite($sock, $head) or die('error:'.$errno.':'.$errstr); 
$headers = fread($sock, 2000); 

echo $headers; 

fwrite($sock, $data) or die('error:'.$errno.':'.$errstr); 
$wsdata = fread($sock, 2000); 
fclose($sock); 

しかし、私が受け取るエラーはです。

error:32744:Unable to find the socket transport "ws" - did you forget to enable it when you configured PHP? 

次に、私はホストを変更し、ws://を使用しないと言います。

error:111:Connection refused 

誰がどのようにプレーンなPHPファイルから実行しているラチェットのWebSocketサーバーにデータを送信するためにアイデアを持っていますか?

答えて

2

私はラチェットと一緒にこのプロジェクトを試してみましたが、それはPHPクライアントとして完璧に動作します: composer require textalk/websocket 1.0.*

と使用例:

https://github.com/Textalk/websocket-php

はしてインストール

<?php 

require('vendor/autoload.php'); 

use WebSocket\Client; 

$client = new Client("ws://127.0.0.1:1234"); 
$client->send("Hello from PHP"); 

echo $client->receive() . "\n"; // Should output 'Hello from PHP' 

私はテストしました。これはwss://を使用している場合はSSLでも動作します(リモートWebソケット)。

+0

@ Raisin.can私たちはこのライブラリを使ってバイト配列をPHPのwebsocketで送ることができます – iCoders

+0

ライブラリは、send()関数が文字列を渡すことを期待しています。 PHPを使用しているサーバー(ラチェットなど)の場合は、クライアント上でバイト配列をシリアル化して、サーバーでシリアル化を解除することができます。ラチェットで受け取ったすべてのメッセージがバイト配列になるわけではない場合は、byte_array:a:44:{i:1; i:84; ...等。 – RaisinBranCrunch

+0

yaもし私がseializeして文字列として送信するが、私にとっては受信側はバイト配列なのでシリアルはできません。 – iCoders

関連する問題