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!!!
  • 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:

  1. Khi client gửi message, server có thể nhận được message và response lại client (đang hoạt động tốt)
  2. 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.

  • Answer
Remain: 5
1 Answer
Avatar
tvd12 Beginner
tvd12 Beginner
Nhì vào code này thì có thể thấy server chỉ gửi về tất cả các client đang kết nối message khi có message từ một client nào đó gửi lên, vậy code mà server chủ động gửi message cho các client thì bạn đang làm thế nào nhỉ?
  • 0
  • Reply
Hi bạn/anh, mình/em có lưu ý tại (x) ở trên là server cũng sẽ có màn chat (re-use lại widget mà client đang dùng).

Khi vào màn chat này, nó cũng sẽ lắng nghe socket như các client khác (mà chính nó đang expose tại port 8080 chả hạn); khi đó, chính nó nhận được message tại webSocketHandler; đoạn này debug thấy được message => OK. (server lúc này như 1 client tên là A)

Nhưng issue là chỗ webSocketHandler, nó thực hiện trả lại response cho các client thì chỉ chính nó (client A) nhận được (đã confirm việc này do message update đc state thành "sent"), còn các client B/C cũng đang lắng nghe socket thì không nhận được response.

Hy vọng vấn đề clear hơn chút ạ :)

 –  kidsoul 1695401076000
Cái thư viện shelf này ít tài liệu thật, theo như bạn nói thì mình thấy không có vấn đề gì cả, tuy nhiên nhìn vào mã nguồn thì mình vẫn chưa thực sự hiểu bạn đang làm gì để mà hỗ trợ. Có vẻ như bạn sử dụng code flutter vừa làm client vừa làm server luôn nhỉ? Mà flutter dùng để phát triển ứng dụng client vậy thì server gì ở đây nhỉ? Hay bạn đang làm ứng dụng peer to peer? Có ngữ cảnh cụ thể có thể mình sẽ hỗ trợ được tốt hơn.  –  tvd12 1695565251000
shelf là thư viện core của Dart để làm web server, ngoài ra có dart_frog framework cũng khá nổi nhưng về bản chất cũng dùng shelf thôi bạn ạ.

>Có vẻ như bạn sử dụng code flutter vừa làm client vừa làm server luôn nhỉ?

Đúng rồi bạn ạ. App mình vừa làm client, vừa làm server được, dạng P2P ấy bạn. Mình ko giỏi về network nên thắc mắc liệu có issue tương tự với các ngôn ngữ/framework khác trong case này không. Nếu có thì bạn share giúp mình 1 vài keywords thôi cũng đc, rồi mình sẽ tìm hiểu tiếp.

 –  kidsoul 1695749992000
Mình thấy bạn đang hiểu đúng vấn đề rồi đấy, từ khóa thì chắc chỉ có là p2p chat flutter example. Bạn thử tham khảo ví dụ này xem sao: https://github.com/Zfinix/tcp_chat  –  tvd12 1695788392000
Cảm ơn bạn, để mình coi xem sao. Nếu fix đc mình sẽ update.  –  kidsoul 1695816532000