PHP和PHP的实时聊天应用程序的WebSockets

时间:2017-03-06 10:51:35

标签: php laravel websocket real-time ratchet

我想在webapp中创建聊天应用程序,用户可以在其中与不同的站点用户聊天。这将在网上和iOS上提供。

我没有使用传统的轮询技术(以1秒的间隔向服务器发送ajax命中),而是想使用websockets。

通过几个教程,但在所有这些教程中,他们已经让PUBLIC GROUP聊天。 (示例网址:https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

任何人都可以了解如何使用PHP& amp;的WebSockets。

我对websockets有基本的想法但是如何使用它们在特定频道上发布数据?如果我们有40个用户,那么我们需要创建40个不同的频道吗?

提前致谢。

3 个答案:

答案 0 :(得分: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提供了一种基本的沟通方式,你应该有创意去做事。

答案 1 :(得分:1)

对于私人(房间)聊天系统,您必须开发自己的逻辑。 我建议你使用以下库:

http://socketo.me/

http://socketo.me/docs/浏览他们的文档并开始编码。 如果您遇到困难,请发布您的代码,社区随时为您提供帮助

答案 2 :(得分: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. 使用棘轮

    创建一个自定义artisan命令以在某个端口上运行websockets
    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();
    }
    

    }

  2. 您的控制器应如下所示

    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>
    

    您需要在backgroud中运行以下命令

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