Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: 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?

  1. #1
    Ngày gia nhập
    04 2007
    Bài viết
    12

    Mặc định 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
    Ngày gia nhập
    06 2007
    Nơi ở
    TP.HCM
    Bài viết
    113

    Trích dẫn Nguyên bản được gửi bởi tienthanh_tn Xem bài viết
    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!!!!

    Gác Kiếm

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    12

    Cảm ơn bạn đã quan tâm đến vấn đề của mình!
    Về phương pháp bạn nêu mình cũng đã nghĩ đến nhưng chưa có thử, mục đích của mình khi đưa ra vấn đề này là giúp Server kiểm soát được Client ngắt kết nối "không lịch sự": do phía client mất điện hay chương trình bị kill process (do dùng Task Manager chẳng hạn) nên khi đó client không thể gửi các thông điệp như bạn đã nói.
    Trước đây khi làm trong Visual C++/MFC, vấn đề này có thể giải quyết dễ dàng với việc sử dụng phương thức ảo OnClose của Socket (dùng được cả ở hai phía Client/Server). Do đó mình nghĩ là trong C# sẽ cũng hỗ trợ (nhưng xem example trong MSDN nó cũng sử dụng việc ko nhận được data - data length = 0 - để nhận biết phía bên kia đã ngắt kết nối)

  4. #4
    Ngày gia nhập
    09 2010
    Nơi ở
    Hải Phòng city
    Bài viết
    527

    Mặc định [C#]Lập trình mạng: Server kiểm soát được thời điểm Client ngắt

    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é.
    ****************************************
    *****Trường Sa, Hoàng Sa là của Việt Nam*****
    ****************************************

  5. #5
    Ngày gia nhập
    10 2008
    Bài viết
    258

    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
    Anh yêu em hí hí

  6. #6
    Ngày gia nhập
    04 2009
    Bài viết
    6

    Mặc định 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?

    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???

  7. #7
    Ngày gia nhập
    03 2009
    Bài viết
    267

    Code:
    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.

  8. #8
    Ngày gia nhập
    05 2010
    Bài viết
    344

    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.

  9. #9
    Ngày gia nhập
    04 2009
    Bài viết
    6

    Trích dẫn Nguyên bản được gửi bởi nhokviet Xem bài viết
    Code:
    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???
    Đã được chỉnh sửa lần cuối bởi phamliem : 02-11-2011 lúc 06:28 AM.

  10. #10
    Ngày gia nhập
    03 2009
    Bài viết
    267

    Trích dẫn Nguyên bản được gửi bởi phamliem Xem bài viết
    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

Các đề tài tương tự

  1. Trả lời: 6
    Bài viết cuối: 28-06-2014, 12:02 PM
  2. Làm sao biết client ngắt kết nối với Server trong Java??
    Gửi bởi songsanh trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 8
    Bài viết cuối: 25-06-2014, 05:36 PM
  3. Socket Không thể xóa Client ngắt kết nối với Server trong danh sách Client đang kết nối
    Gửi bởi thanhtanh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 20-10-2012, 04:37 PM
  4. Chạy ứng dụng client/server vc++ trên 2 máy, làm thế nào để client kết nối server?
    Gửi bởi hotritam365 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 12-07-2012, 10:20 PM
  5. Kiểm tra xem client nào đã ngắt kết nối tới server?
    Gửi bởi Joker trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 9
    Bài viết cuối: 27-05-2012, 05:02 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn