2016-04-07 4 views
1

ラチェット(PHPのリアルタイムチャットアプリケーションで使用されるライブラリ)を学習しています。 Rachetのリアルタイムの1対1メッセージ

  1. は誰からメッセージが来て、
  2. メッセージ:ドキュメントごとに、次の関数は2つのことを受け取ることになります。

ただし、送信する相手を逃してしまいます。この機能は、接続されているすべての人にメッセージを送信します。しかし、私は1対1のチャットを実装したい。それを行う方法はありますか?

以下はそのライブラリのリンクです:http://socketo.me/docs/hello-world

public function onMessage(ConnectionInterface $from, $msg) { 
    //send the message to all the other clients except the one who sent. 
    foreach ($this->clients as $client) { 
     if ($from !== $client) { 
      $client->send($msg); 
     } 
    } 
} 
+0

まだ1対1のメッセージを制限する余地はありませんか? dunnoは以前はそれを使用していませんでした。 – Chay22

+0

https://github.com/php-pure/sacky-serverを試すことができます – daison12006013

答えて

1

私はあなたが望むチャットごとに異なるサブスクリプションを作ることをお勧めします。みんなの間でのチャットメッセージの

1チャネル:subscriptionname = room123

そして、あなたは別の署名に使用でき、各個人チャット:subscriptionname = personal456を。

次に、クライアント側のアプリケーションに、2つの相違するサブスクリプションをリッスンさせ、メッセージを受信したサブスクリプションの名前が何であるかに応じてルーティングを試みます。

0

はい、1対1のメッセージを送信できます。しかし、これらはまだソケットサーバーを経由する必要があります。ブラウザ間で直接ピアツーピアメッセージングを行うことはできません。各ユーザーは、永続的に開いている接続を持っていますが、サーバーとのみ接続しています。

$this->clientsをトラバースするときに、接続またはユーザー名を取得できるように、各クライアント接続に対してユーザー名を格納する必要があります。次に、このリストをすべてのサブスクライバーにブロードキャストできます。

最後に、各ユーザーが指定することで、プライベートメッセージを送信することができる:

  • をメッセージテキスト
  • それは、これは、ラチェットによって受信される

に対処している人にユーザ名をそこからユーザ名を使用して$this->clientsに接続ルックアップを行うことができます。終了した接続は、まだ開いている場合は、メッセージの転送に使用する接続です。

オプションで、送信者にメッセージを送信した(または送信しなかった)ことを伝える "ack"(確認応答)を送信できます。