2017-03-06 103 views
2

我想在web應用程序中創建聊天應用程序,用戶可以與不同的站點用戶聊天。這將在網上和iOS上提供。使用PHP和Websockets實時聊天應用程序

而不是使用傳統的輪詢技術(在1秒的時間間隔內發送ajax命中到服務器),我想使用websockets。

通過幾個教程,但在他們所有的人都做了PUBLIC GROUP聊天。 (示例網址:https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

任何人都可以有想法如何開發使用PHP的私人聊天& Websockets。

我有websockets的基本思想,但如何使用它們發佈特定頻道上的數據?如果我們有40個用戶,那麼我們需要創建40個不同的頻道?

在此先感謝。

+0

[編寫一個聊天應用程序的可能的複製](http://stackoverflow.com/questions/3682198/writing-a-chat-application) –

+0

你顯示一個例子的鏈接,然後問任何想法?在SO上,人們在代碼問題上的幫助?並說出你的朋友停止upvote你的問題。你的問題是廣泛的,而不是代碼相關。 – JustOnUnderMillions

+1

@JustOnUnderMillions,那個鏈接只是websocket的演示教程。除了代碼問題之外,我們也可以討論架構問題。我只想知道如何實現上述方法 –

回答

1

對於私人(房間)聊天系統,你必須開發自己的邏輯。 我會建議您使用以下庫:

http://socketo.me/

通過他們的文檔在http://socketo.me/docs/開始編碼。 如果您遇到問題,請發佈您的代碼和社區以便幫助

+0

同意,我們必須我們自己的邏輯。但是,你可以請分享鏈接/教程使用套接字io創建2個通道。邏輯部分對我來說很清楚,我目前陷入困境的是如何創建多個通道,並在客戶端部分如何僅訂閱特定通道。 –

+0

您可以訪問github存儲庫以供參考,並使用php套接字使用https://github.com/pmill/php-chat完成多房間私人聊天的代碼。 –

2

與做單一全球聊天和多個專用頻道沒有多大區別。首先,你需要設計一個協議。讓我們創建一個簡單的協議:

// 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和其他依賴項。請檢查https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51

  1. 製作一個自定義的工匠命令使用棘輪

    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(); 
    } 
    

    }

你的控制器應運行某些端口上的WebSockets像下面

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\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部分訂閱的頻道

<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> 

您需要在研究背景運行以下命令

1. php artisan run:socket <port_no> 
2. Node yourjavascript.js