- Tại server, mình dùng shelf để tạo websocket, xử lý các request từ client:
final routerHandler = shelf_router.Router() ..get('/message', (request) => handleWs(request)); Cascade cascade = Cascade() .add(routerHandler) var handler = const Pipeline().addHandler(cascade.handler); await shelf_io.serve(handler, ipAddress, port)
FutureOr<Response> handleWs(Request request) { final channels = <WebSocketChannel>[]; return ws.webSocketHandler((WebSocketChannel channel) { channels.add(channel); channel.stream.listen((message) { try { final receivedMessage = Message.fromJson(json.decode(message)); final updatedMessage = receivedMessage.copyWith(messageState: MessageState.sent); final response = json.encode(updatedMessage.toJson()); for (final c in channels) { c.sink.add(response); } } catch (e) { debugPrint('Error while handling incoming message in socket: ${e.toString()}'); } }, onDone: () => channels.remove(channel) ); })(request); }
- Tại client sẽ kết nối, lắng nghe websocket (UI/Logic tại page client dùng chung cho cả server) (x)
@override void initState() { super.initState(); _handleSocket(); } void _handleSocket() { _webSocketChannel = WebSocketChannel.connect(Uri.parse(endpoint)); _webSocketChannel.stream.listen((response) { print('response from ws: $response'); }); }
Gửi message lên websocket:
void _sendMessage() async { final data = json.encode(message.toJson()); _webSocketChannel.sink.add(data); }
Kịch bản:
- Khi client gửi message, server có thể nhận được message và response lại client (đang hoạt động tốt)
- Khi server gửi message, dùng chung UI/logic như client (x), thì socket server có nhận được message nhưng client lại không nhận được response như kịch bản (1)
Không biết mô hình này có hoạt động được hay không hay do lỗi triển khai, mong các bạn giải đáp giúp mình.