그래도 1장은 쓰고 자자
가장 중요한, 메시지를 서로 주고받은 부분에 대해서 말해보고자 합니다
우선 기본적인 라라벨 환경이 구축된 상태인 것을 상정하고 작성하겠습니다!
composer require cboden/ratchet
우선 ratchet을 설치 해야겠죵?
그리고 우리가 할 작업이 세가지가 있습니다
첫째, server.php작성
둘째, server.php에서 사용할 웹소켓 컨트롤러
셋쨰, 자바스크립트를 통한 커넥팅
먼저 server.php를 작성해볼까요?
1. server.php 작성
<?php
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use App\Http\Controllers\WebSocketController;
require 'vendor/autoload.php';
try {
$server = IoServer::factory(
new HttpServer(
new WsServer(
new WebSocketController()
)
),
8005
);
echo "웹소켓 서버가 실행 중입니다...\n";
$server->run();
} catch (\Exception $e) {
echo "웹소켓 서버 실행 중 오류가 발생했습니다: " . $e->getMessage() . "\n";
}
대충 요렇게 작성하시면 됩니다.
use App\Http\Controllers\WebSocketController;
이 부분에는 여러분이 작성하실 컨트롤러 이름을 적어주면 되겠습니다.
터미널을 하나 열어서 해당 서버를
php server.php
위 명령어를 통해 실행해주면
두번째 인자로 전달해준 포트 번호로 웹소켓 서버가 열리게 됩니다.
2. 컨트롤러 작성
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
use Illuminate\Support\Facades\Cache;
class WebSocketController extends Controller implements MessageComponentInterface {
protected $chatRooms;
public function __construct() {
$this->chatRooms = [];
}
public function onOpen(ConnectionInterface $conn) {
$path = $conn->httpRequest->getUri()->getPath();
$parts = explode('/', $path);
$chatRoom = $parts[2];
if (!isset($this->chatRooms[$chatRoom])) {
$this->chatRooms[$chatRoom] = new \SplObjectStorage();
}
$this->chatRooms[$chatRoom]->attach($conn);
echo "새로운 연결 ({$chatRoom}) / 현재 총 연결 : {$this->chatRooms[$chatRoom]->count()}\n";
}
public function onMessage(ConnectionInterface $from, $msg) {
$path = $from->httpRequest->getUri()->getPath();
$parts = explode('/', $path);
$chatRoom = $parts[2];
foreach ($this->chatRooms[$chatRoom] as $client) {
$client->send($msg);
}
}
public function onClose(ConnectionInterface $conn) {
$path = $conn->httpRequest->getUri()->getPath();
$parts = explode('/', $path);
$chatRoom = $parts[2];
// 해당 채팅방에서 연결을 제거
$this->chatRooms[$chatRoom]->detach($conn);
// 만약 채팅방에 연결이 더 이상 없다면, 채팅방 자체를 제거
if ($this->chatRooms[$chatRoom]->count() === 0) {
unset($this->chatRooms[$chatRoom]);
}
echo "커넥션 {$conn->resourceId} 연결이 끊어졌습니다\n";
}
public function onError(ConnectionInterface $conn, \Exception $e) {
echo "에러 발생: {$e->getMessage()}\n";
$conn->close();
}
}
생성자를 뺀 함수명 따라서 간단히 설명하자면
onOpen : 새롭게 연결하는 순간 실행되는 함수
onMessage : 클라이언트로부터 메시지가 전송되었을 때 실행되는 함수
onClose : 커넥션이 종료되었을 때 실행되는 함수
onError : 에러 발생 시 실행되는 함수
매우 직관적이지요?
기본적인 틀에서 제가 수정한 부분이 있습니다만
chatRooms 배열을 수정했습니다
일반적으로는 client를 저장하는 배열을 사용하는 것 같습니다만
저는 방에 있는 모든 클라이언트에게 메시지를 보내준다는 것과
그룹채팅도 만들 예정이기에 방번호를 키값으로
클라이언트들을 value로 넣어서 관리하는 것이 효율적이기 때문입니다
모든 유저들을 돌아가면서 방번호를 체크하면 비효율적이겠죠?
연결 시마다 채팅방 번호를 가져와서 커넥션 정보와 커넥션마다 접속한 채팅방 번호를 저장하기 위함입니다
이번 글은 여기까지!
다음에는 자바스크립트를 통한 커넥션과 메시지를 주고받아보겠습니다
아래는 제가 직접 손수 수작업으로 하나부터 열까지 전부 직접 작성한 커뮤니티사이트 입니다
신생커뮤니티라서 많이 삭막하지만 들려주시면 고마울 것 같아요!
'프로그래밍 > PHP and Laravel' 카테고리의 다른 글
PHP Laravel 에서 사이트맵을 생성하는 간단한 방법 (0) | 2024.03.11 |
---|---|
WebSocket을 활용한 PHP 라라벨 실시간 채팅 - 2. 자바스크립트에서 웹소켓과 통신하기 (0) | 2024.02.24 |
WebSocket을 활용한 PHP 라라벨 실시간 채팅 구현 - 개요 (0) | 2024.02.05 |