WebSocket
Finch ondersteunt WebSocket via een drieklasdontwerp: SocketManager voor registratie, SocketEvent voor gebeurtenisdefinitie en SocketController voor berichtverwerking.
Installatie
1. Maak een SocketController aan
import 'package:finch/finch_route.dart';
class ChatController extends SocketController {
@override
void onConnect(SocketClient client) {
print('Gebruiker verbonden: \${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;
}
}
}
2. WebSocket-route registreren
router.ws('/chat', ChatController());
SocketController-methoden
| Methode | Beschrijving |
|---|---|
sendTo(client, event) |
Verzenden naar een specifieke client |
sendToAll(event) |
Verzenden naar alle verbonden clients |
sendToAllExcept(client, event) |
Verzenden naar iedereen behalve één client |
broadcast(room, event) |
Verzenden naar een ruimte |
joinRoom(client, room) |
Client aan een ruimte toevoegen |
leaveRoom(client, room) |
Client uit een ruimte verwijderen |
JavaScript-client
const socket = new WebSocket('ws://localhost:8080/chat');
socket.onopen = () => {
console.log('Verbonden');
};
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Ontvangen gebeurtenis:', data.name, data.data);
};
function sendMessage(message) {
socket.send(JSON.stringify({
name: 'chat_message',
data: { message }
}));
}
socket.onclose = () => {
console.log('Verbinding verbroken');
};
Ruimten (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}));
}
}