WebSocket
فینچ از WebSocket از طریق یک طراحی سهکلاسه پشتیبانی میکند: SocketManager برای ثبت، SocketEvent برای تعریف رویدادها، و SocketController برای پردازش پیامها.
راهاندازی
۱. یک SocketController بسازید
import 'package:finch/finch_route.dart';
class ChatController extends SocketController {
@override
void onConnect(SocketClient client) {
print('کاربر وصل شد: \${client.id}');
sendToAll(SocketEvent('user_joined', {'id': client.id}));
}
@override
void onDisconnect(SocketClient client) {
sendToAll(SocketEvent('user_left', {'id': client.id}));
}
@override
void onMessage(SocketClient client, SocketEvent event) {
switch (event.name) {
case 'chat_message':
var message = event.data['message'] as String;
sendToAllExcept(
client,
SocketEvent('chat_message', {
'from': client.id,
'message': message,
}),
);
break;
}
}
}
۲. Route WebSocket را ثبت کنید
router.ws('/chat', ChatController());
متدهای SocketController
| متد | توضیح |
|---|---|
sendTo(client, event) |
ارسال به یک کاربر مشخص |
sendToAll(event) |
ارسال به همه کاربران متصل |
sendToAllExcept(client, event) |
ارسال به همه به جز یک کاربر |
broadcast(room, event) |
ارسال به یک room |
joinRoom(client, room) |
اضافه کردن کاربر به room |
leaveRoom(client, room) |
خارج کردن کاربر از room |
کلاینت JavaScript
const socket = new WebSocket('ws://localhost:8080/chat');
socket.onopen = () => {
console.log('متصل شد');
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('رویداد دریافت شد:', data.name, data.data);
};
function sendMessage(message) {
socket.send(JSON.stringify({
name: 'chat_message',
data: { message }
}));
}
socket.onclose = () => {
console.log('اتصال قطع شد');
};
اتاقها (Rooms)
@override
void onMessage(SocketClient client, SocketEvent event) {
if (event.name == 'join_room') {
var room = event.data['room'] as String;
joinRoom(client, room);
broadcast(room, SocketEvent('room_joined', {'user': client.id}));
}
}