2017-03-06 69 views
2

さまざまなサイトユーザとチャットできるWebアプリケーションでチャットアプリケーションを作成したいと思います。これはウェブ上やiOS上でも利用できます。PHPとWebSocketを使用したリアルタイムチャットアプリケーション

伝統的なポーリング手法(1秒間隔でサーバーにajaxヒットを送信する)を使用する代わりに、Webソケットを使用します。

チュートリアルのカップルを通過しましたが、すべてがパブリックグループチャットを行いました。 (サンプルURL:https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

PHP & WebSocketを使用してプライベートチャットを開発する方法を知っている人はいますか?

私はウェブソケットの基本的な考え方を持っていますが、それらを使って特定のチャネルにデータを公開する方法はありますか? 40人のユーザーがいる場合、40の異なるチャンネルを作成する必要がありますか?

ありがとうございます。

+0

その背景には、次のコマンドを実行する必要があります](http://stackoverflow.com/questions/3682198/writing-a-chat-application) –

+0

あなたはexampleへのリンクを表示してから、何か考えてもらえますか?人々がコードの問題を助ける場所で?あなたの質問をupvote停止するようにあなたの友人を言う。あなたは疑問にぶつかり、コードに関連していません。 – JustOnUnderMillions

+1

@JustOnUnderMillions、そのリンクはWebSocketのデモチュートリアルです。コードの問題だけでなく、アーキテクチャの問題についても議論することができます。私はアプローチを知りたい、上記の達成方法を教えてください。 –

答えて

1

プライベート(ルーム)チャットシステムの場合、実際には独自のロジックを開発する必要があります。 は、私は次のライブラリを使用するためにあなたをお勧めします:

http://socketo.me/

http://socketo.me/docs/で彼らのドキュメントを通過し、コーディングを始めます。 あなたのコードを掲示すれば、コミュニティは助けになります

+0

合意しました。私たち自身の論理。しかし、ソケットioを使用して2つのチャンネルを作成するにはリンク/チュートリアルを共有してください。ロジックの部分は私には明らかです。私は現在、複数のチャネルを作成する方法とクライアントの部分で特定のチャネルのみを購読する方法を固執しています。 –

+0

phpソケットを使用してhttps://github.com/pmill/php-chatを使用して、複数の部屋のプライベートチャットの参照と完全なコードについてgithubリポジトリにアクセスできます。 –

2

1つのグローバルチャットと複数のプライベートチャンネルを行うこととあまり違いはありません。まず、プロトコルを設計する必要があります。ユーザーがサーバーに接続するときに、あなたがランダムに彼の名を割り当てることができます

// client send to server 
JOIN <channel_id> 
LEAVE <channel_id> 
MSG <channel_id> <message> 

// server send to client 
JOIN <channel_id> <username> 
LEAVE <channel_id> <username> 
MSG <channel_id> <username> <message> 
  • :単純なプロトコルを作成してみましょう。すべての接続を格納する配列があります。
  • チャンネルの配列を作成します。各チャネルは、チャネル内にユーザーの配列を保持します。
  • クライアントがJOIN <channel_id>をサーバーに送信したとき。そのチャネルのすべての接続にブロードキャストJOIN <channel_id> <username>をブロードキャストします。
  • クライアントがサーバーにMSG <channel_id> <message>を送信したとき。そのチャネルのすべての接続にブロードキャストMSG <channel_id> <username> <message>を送信します。
  • ようにとの....

だから、基本的に、WebSocketのは、あなたが事を行うには、創造する点で最大それは、通信の基本的な方法を提供します。

+0

あなた自身のプロトコルを書いてはいけません、これはWAMPのものを再発明しています。 http://socketo.me/docs/wampを見てください。 – Alcalyn

0

これは私がLaravelでやった方法です.Predis、socket.io、ratchetなどの依存関係をインストールする必要があります。ラチェット

あなたのコントローラは以下

namespace MyApp; 
use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 

class ChatController implements MessageComponentInterface { 
    public function onOpen(ConnectionInterface $conn) { 
    } 

    public function onMessage(ConnectionInterface $from, $msg) { 
    //FIRE A BROADCAST EVENT HERE 
     event(new MessageBroadcast(
         $message, 
         $datetime, 
         $user_id 
         ) 
       ); 
    } 

    public function onClose(ConnectionInterface $conn) { 
    } 

    public function onError(ConnectionInterface $conn, \Exception $e) { 
    } 
} 
ようにする必要があり
namespace App\Console\Commands; 

use Illuminate\Console\Command; 

use Ratchet\Server\IoServer; 

class webSockets extends Command 
{ 
    /** 
    * The name and signature of the console command. 
    * 
    * @var string 
    */ 

protected $signature = 'run:socket {port?}'; 

/** 
* The console command description. 
* 
* @var string 
*/ 
protected $description = 'Run websockets for specified port'; 

/** 
* Create a new command instance. 
* 
* @return void 
*/ 
public function __construct() 
{ 
    parent::__construct(); 
} 

/** 
* Execute the console command. 
* 
* @return mixed 
*/ 
public function handle() 
{ 
     $port = $this->argument('port'); 
     $server = IoServer::factory(
     new ChatController(),$port 
     $server->run(); 
} 

}

を使用して、いくつかのポートでのWebSocketを実行するために、1つのカスタム職人コマンドを作るhttps://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51

  1. をご確認ください

    THE BROADCAST CLASSは、チャネル

    <script src="{ { asset('js/socket.io.js') } }"></script> 
        <script> 
         //var socket = io('http://localhost:3000'); 
         var socket = io('http://yourip:5000'); 
         socket.on("test-channel1:App\\Events\\EventName", function(message){ 
          // get user on console 
          console.log(message); 
         }); 
        </script> 
    

    を購読するには、以下の

    namespace App\Events; 
    use App\Events\Event; 
    use Illuminate\Contracts\Broadcasting\ShouldBroadcast; 
    use Illuminate\Queue\SerializesModels; 
    
    class MessageBroadcast extends Event implements ShouldBroadcast 
    { 
        use SerializesModels; 
    
        public $message,$datetime,$userid; 
    
        public function __construct($message,$datetime,$userid) 
        { 
         $this->message = $message; 
         $this->datetime = $datetime; 
         $this->userid = $userid; 
    
    
        } 
    
        public function broadcastOn() 
        { 
         return ['test-channel'.$this->user_id]; 
        } 
    } 
    

    Javascriptの一部のようになりますあなたは[チャットアプリケーションを書くの可能重複

    1. php artisan run:socket <port_no> 
    2. Node yourjavascript.js 
    
関連する問題