راهنمای WebSocket

فینچ از ارتباط WebSocket برای ارتباط بلادرنگ بین سرور و کلاینت‌ها پشتیبانی می‌کند. می‌توانید با استفاده از WebSocket برنامه‌هایی مانند چت، اعلان زنده و غیره بسازید.

استفاده از WebSocket در Finch

برای تعریف WebSocket در برنامه فینچ خود باید از کلاس SocketManager استفاده کنید. این کلاس برای مدیریت ارتباطات WebSocket در برنامه شما به کار می‌رود و تمام ویژگی‌های لازم را دارد. سپس می‌توانید با متد addSocketRoute مسیرهای WebSocket را به برنامه اضافه کنید و با کنترلر مربوطه ارتباط را مدیریت نمایید.

SocketManager

کلاس SocketManager برای مدیریت ارتباطات WebSocket در برنامه فینچ استفاده می‌شود. مثال:

final socketManager = SocketManager(
  app,
  event: SocketEvent(
    onConnect: (socket) {
      app.socketManager?.sendToAll(
        "کاربر جدید متصل شد! تعداد: ${app.socketManager?.countClients}",
        path: "output",
      );
    },
  ),
);

ایجاد مسیر WebSocket

می‌توانید یک مسیر WebSocket را در برنامه فینچ خود به صورت زیر تعریف کنید:

FinchRoute(
  key: 'root.ws',
  path: 'ws',
  ws: (ws) {
    ws.onMessage((msg) {
      ws.send('اکو: ' + msg);
    });
  },
)

اتصال از سمت کلاینت

می‌توانید از سمت کلاینت با استفاده از JavaScript به سرور WebSocket متصل شوید:

const socket = new WebSocket('ws://localhost:3000/ws');
socket.onmessage = (event) => {
  console.log('دریافت شد:', event.data);
};
socket.send('سلام سرور!');

مثال

برای مشاهده مثال کامل، به پروژه example در مخزن فینچ مراجعه کنید.

افزودن مسیرهای سوکت به FinchApp

تابع getSocketRoute() یک Map<String, SocketEvent> بازمی‌گرداند. می‌توانید آن را با متد addSocketRoute به نمونه FinchApp اضافه کنید. مثال:

Map<String, SocketEvent> getSocketRoute() {
  return {
    'test': SocketEvent(
      onMessage: (socket, data) {
        socket.send([socket.rq.headers], path: 'test');
      },
    ),
  };
}

کنترلر سوکت نمونه

class SocketController extends Controller {
  Future<String> socket() async {
    await socketManager.requestHandle(rq);
    return rq.renderSocket();
  }
}
FinchRoute(
  key: 'root.ws',
  path: '/ws',
  methods: Methods.ALL,
  index: socketController.socket,
)