Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1

    Lập trình mạng với C#: Server kiểm soát được thời điểm Client ngắt kết nối?

    Mình đang thử viết một chương trình chat Multiclient. Vấn đề mình đang gặp phải là không thấy có sự kiện nào cho phép Server biết được Client đã disconnect , nghĩa là khi socket bên phía client gọi phương thức Disconnect thì bên Server sẽ nhận được sự kiện này và hủy socket gắn với client này và cập nhật các thông tin trên form.
    (trong các MSDN thì chỉ thấy nói là khi không nhận được data thì nghĩa là client đã đóng kết nối nhưng cách này mình thấy không ổn lắm).

    Mong các bạn giúp đỡ!

  2. #2
    Trích dẫn Gửi bởi tienthanh_tn
    Mình đang thử viết một chương trình chat Multiclient. Vấn đề mình đang gặp phải là không thấy có sự kiện nào cho phép Server biết được Client đã disconnect , nghĩa là khi socket bên phía client gọi phương thức Disconnect thì bên Server sẽ nhận được sự kiện này và hủy socket gắn với client này và cập nhật các thông tin trên form.
    (trong các MSDN thì chỉ thấy nói là khi không nhận được data thì nghĩa là client đã đóng kết nối nhưng cách này mình thấy không ổn lắm).

    Mong các bạn giúp đỡ!
    Mình đã từng làm một bài multi chat này, cách mình quản lý việc client ngắt kết nối là như sau: Khi client ngắt kết nối thì tại client sẽ gửi đi một thông điệp nhận biết để server xác định được client ngắt kết nối. Tại server sau khi nhận được ngắt kết nối sẽ giải phóng socket quản lý client đó. Và mình cho cái việc client gửi ký tự đặc biệt nhận biết disconnect là trong Form_Closed.

    Và một cách khác mà mình nghĩ đến là cứ để mặc kệ client disconnect, tại server khi nào gửi message mà thấy socket nào đó có lỗi thì xác định lỗi và giải phóng socket đó.

    Đó là cách mình làm, còn tại server không biết có thuộc tính nào nhận biết khác không (đã thử tìm nhưng không thấy).

    Chúc bạn thành công!!!!

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    mình cũng làm như cách trên đó là khi bạn ấn disconnet thì bạn sẽ dùng sự kiện đó để gửi 1 ký tự đặc biệt sang phía Sever để phía Sever biết giải phóng socket. Theo mình có thể đó là cáh giải quyết tốt nhất.
    ai còn cách giải quyết nào khác trong C# không, giúp anh em tìm ra hướng giải quyết tốt nhất nhé.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    nếu trường hợp client như bạn thì bạn có thể cho server trong khoảng thời gian nhất định thì gửi request đến client. nếu không có tín hiệu trả lời lại thì close kết nối đó là được

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Chào các bạn ! Mình cũng gặp trường hợp như này rồi nhưng chưa biết cách giải quyết như thế nào cho hợp lý. Nếu như theo Thansautk nói thì khi đó server sẽ quá tải nếu có khoảng vài nghìn Client kết nối đến. Có bạn nào biết thì chỉ mình với???

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    bool SocketConnected(Socket s)
        {
            bool part1 = s.Poll(1000, SelectMode.SelectRead);
            bool part2 = (s.Available == 0);
            if (part1 & part2)
                return false;
            else
                return true;
        }
    Cái này đc 100% từng làm rồi, và cũng reply cái này nhìu ở trong 4rum này rồi, ko biết bạn có tìm kiếm hay chưa.

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình thì dùng try catch để bắt exception trong lệnh đọc dữ liệu từ client về, mỗi khi client bị disconnect(ko cần biết vì lý do gì) thì lệnh đọc dữ liệu trên server từ client thì sẽ sinh ra exception.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nhokviet
    Mã:
    bool SocketConnected(Socket s)
        {
            bool part1 = s.Poll(1000, SelectMode.SelectRead);
            bool part2 = (s.Available == 0);
            if (part1 & part2)
                return false;
            else
                return true;
        }
    Cái này đc 100% từng làm rồi, và cũng reply cái này nhìu ở trong 4rum này rồi, ko biết bạn có tìm kiếm hay chưa.
    Chương trình này để kiểm tra sự tồn tại của Client đúng ko bác??? Nếu đúng như thế thì sau mỗi khoảng thời gian (dùng Timer) Server lại kiểm tra hàm này, như vậy cũng khá bất tiện. Hơn nữa nếu Server die thì làm sao Client biết được??? Mình có biết 1 hàm SetSocketOption, nhưng mình chưa thử . Đã có bác nào dùng hàm này chưa???

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi phamliem
    Chương trình này để kiểm tra sự tồn tại của Client đúng ko bác??? Nếu đúng như thế thì sau mỗi khoảng thời gian (dùng Timer) Server lại kiểm tra hàm này, như vậy cũng khá bất tiện. Hơn nữa nếu Server die thì làm sao Client biết được??? Mình có biết 1 hàm SetSocketOption, nhưng mình chưa thử . Đã có bác nào dùng hàm này chưa???
    cái này cả client và sv đều xài đc :| tạo 1 thread kiểm tra

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi nhokviet
    cái này cả client và sv đều xài đc :| tạo 1 thread kiểm tra
    nhokviet có thể nói rõ hơn không? Hơn nữa mình dùng TcpListener.AcceptTcpClient() nên không biết dùng poll ntn? bạn có thể post 1 đoạn code mẫu ko? như vậy mọi người có thể hình dung tốt hơn. Cảm ơn bạn.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •