kidsoul
1 questions
1 answers
Avatar
0
kidsoul Beginner
kidsoul Beginner
Client không nhận được message từ socket server nếu server chủ động gửi message
Mình đang phát triển tính năng chat giữa các devices trên Flutter gặp một lỗi như sau, google vẫn chưa ra hoặc chưa đúng keyword; không biết anh/chị/bạn nào từng gặp phải thì gợi ý cho mình với ạ. Xin cảm ơn mọi người!!! <ul> <li>Tại server, mình dùng shelf để tạo websocket, xử lý các request từ client:</li></ul> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">final</span> routerHandler = shelf_router.Router() ..get(<span class="pl-s">'/message'</span>, (request) =&gt; handleWs(request)); Cascade cascade = Cascade() .add(routerHandler) <span class="pl-k">var</span> handler = <span class="pl-k">const</span> Pipeline().addHandler(cascade.handler); <span class="pl-k">await</span> shelf_io.serve(handler, ipAddress, port) </pre> </div><div class="markdown-block position-relative overflow-auto"> <pre> FutureOr&lt;Response&gt; handleWs(Request request) { <span class="pl-k">final</span> channels = &lt;WebSocketChannel&gt;[]; <span class="pl-k">return</span> ws.webSocketHandler((WebSocketChannel channel) { channels.add(channel); channel.stream.listen((message) { <span class="pl-k">try</span> { <span class="pl-k">final</span> receivedMessage = Message.fromJson(json.decode(message)); <span class="pl-k">final</span> updatedMessage = receivedMessage.copyWith(messageState: MessageState.sent); <span class="pl-k">final</span> response = json.encode(updatedMessage.toJson()); <span class="pl-k">for</span> (final c <span class="pl-k">in</span> channels) { c.sink.add(response); } } <span class="pl-k">catch</span> (e) { debugPrint(<span class="pl-s">'Error while handling incoming message in socket: ${e.toString()}'</span>); } }, onDone: () =&gt; channels.remove(channel) ); })(request); } </pre> </div> <ul> <li>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)</li></ul> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-s">@override</span> <span class="pl-k">void</span> initState() { super.initState(); _handleSocket(); } <span class="pl-k">void</span> _handleSocket() { _webSocketChannel = WebSocketChannel.connect(Uri.parse(endpoint)); _webSocketChannel.stream.listen((response) { print(<span class="pl-s">'response from ws: $response'</span>); }); } </pre> </div><p> Gửi message lên websocket: </p> <div class="markdown-block position-relative overflow-auto"> <pre> <span class="pl-k">void</span> _sendMessage() <span class="pl-k">async</span> { <span class="pl-k">final</span> <span class="pl-k">data</span> = json.encode(message.toJson()); _webSocketChannel.sink.add(data); } </pre> </div><p> Kịch bản: </p> <ol start="1"> <li>Khi client gửi message, server có thể nhận được message và response lại client (đang hoạt động tốt)</li> <li>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)</li> </ol> <p> 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. </p>
Answer