2017-03-06 22 views
2

사용자가 다른 사이트 사용자와 채팅 할 수있는 웹 응용 프로그램에서 채팅 응용 프로그램을 만들고 싶습니다. 이 기능은 웹 및 iOS에서도 사용할 수 있습니다.PHP 및 웹 소켓으로 실시간 채팅 응용 프로그램

전통적인 폴링 기법 (1 초 간격으로 서버에 아약스 히트를 전송) 대신 웹 소켓을 사용하고 싶습니다.

튜토리얼을 몇 개 통과했지만 모든 사람들이 PUBLIC GROUP 채팅을했습니다. (샘플 URL : https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket)

누구든지 PHP & 웹 소켓을 사용하여 개인 채팅을 개발하는 방법에 대한 아이디어가 있습니까?

웹 소켓에 대한 기본적인 아이디어가 있지만 특정 채널에 데이터를 게시하는 방법은 무엇입니까? 40 명의 사용자가있는 경우 40 개의 다른 채널을 만들어야합니까?

미리 감사드립니다.

+0

가능한 복제를 다음 명령을 실행해야 채널을 구독 할 수

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]; } } 

자바 스크립트 부분 아래 같아야합니다 ] (http://stackoverflow.com/questions/3682198/writing-a-chat-application) –

+0

예제에 대한 링크를 보여주고 어떤 아이디어가 있습니까? 그래서 사람들이 코드 문제에 도움을 줍니까? 그리고 당신의 친구들이 당신의 질문을 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

하나의 단일 글로벌 채팅과 여러 개인 채널과 크게 다르지 않습니다. 첫째, 프로토콜을 설계해야합니다. 간단한 프로토콜을 만들어 보자 : 사용자가 서버에 연결할 때

// 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>을 브로드 캐스팅하십시오.
  • 와에가 ....

그래서 기본적으로, 웹 소켓은 일을 할 창조적으로 최대 개까지 그것이 의사 소통의 기본 방법을 제공합니다.

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

    }

당신의 컨트롤러가 있어야한다을 사용하여 일부 포트에서 WebSocket을 실행 한 사용자의 장인 명령을 확인 확인하시기 바랍니다 같은

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) { 
    } 
} 
아래

방송의 클래스

<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