Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Làm sao biết client ngắt kết nối với Server trong Java??

  1. #1
    Ngày gia nhập
    11 2012
    Bài viết
    8

    Mặc định Làm sao biết client ngắt kết nối với Server trong Java??

    Hi, mình gà về java nên muốn hỏi các bạn xíu
    mình viết một đoạn code bằng java để làm chuơng trình server, ví dụ có client B kết nối tới port C trên server A, vậy nếu client B này xảy ra sự cố (bị shutdown, đứt mạng... ?) thì làm sao server nhận biết được nhỉ (để xuất ra câu thông báo là client đã ngắt kết nối thôi) ? mình xem mấy code chat bằng java chỉ thấy client gửi chuỗi yêu cầu ngắt kết nối thì server ngắt kết nối ko à!

  2. #2
    Ngày gia nhập
    10 2010
    Nơi ở
    Internet
    Bài viết
    33

    client B này xảy ra sự cố (bị shutdown, đứt mạng... ?) thì tự động server quăng ra try catch. bạn dựa vào đó mà thông báo.

  3. #3
    Ngày gia nhập
    11 2012
    Bài viết
    8

    Trích dẫn Nguyên bản được gửi bởi Quy_ny Xem bài viết
    client B này xảy ra sự cố (bị shutdown, đứt mạng... ?) thì tự động server quăng ra try catch. bạn dựa vào đó mà thông báo.
    Mình làm như bạn nói
    server sau khi có kết nối thì tạo ra thread để quản lý kết nối đó
    code thread như bên dưới:

    Java Code:
    1. class clientThread extends Thread{
    2.    
    3.     DataInputStream is = null;
    4.     PrintStream os = null;
    5.     Socket clientSocket = null;
    6.     clientThread t[];
    7.     int myI;
    8.     boolean connected = true;    
    9.    
    10.     public clientThread(Socket clientSocket, clientThread[] t, int myI){
    11.     this.clientSocket=clientSocket;
    12.         this.t=t;
    13.         this.myI=myI;
    14.     }
    15.    
    16.     public void run()
    17.     {
    18.         String strFromClient;
    19.         try{
    20.             is = new DataInputStream(clientSocket.getInputStream());
    21.             os = new PrintStream(clientSocket.getOutputStream());      
    22.          
    23.             while (connected) {
    24.                
    25.                 try{
    26.                     strFromClient = is.readLine();
    27.                     if (strFromClient == null)
    28.                        {
    29.                            System.out.println("Client Disconnected!");
    30.                            connected = false;
    31.                         }
    32.                                 else {
    33.                                      System.out.println("Client Disconnected!");
    34.                                 }
    35.                            }
    36.                            catch(java.net.SocketTimeoutException e) {
    37.                        System.out.println("Timed out trying to read from socket");
    38.                    }
    39.                       }
    40.                  }
    41.                  catch(IOException e){
    42.             System.out.println("FAIL");
    43.         };
    44.         }
    45. }


    Nhưng khi client đã kết nối tới server rồi, đã chạy thread rồi nhưng mình tắt client thì nó chả bắt cái ngoại lệ nào cả (chẳng in ra cái gì hết).

    Vậy sai ở chỗ nào nhỉ ?

  4. #4
    Ngày gia nhập
    10 2010
    Nơi ở
    Internet
    Bài viết
    33

    server sau khi có kết nối thì tạo ra thread để quản lý kết nối đó
    Bên server bạn phải tạo 1 thread chính chờ các client kết nối vào.
    Sau khi có client kết nối vào thì tạo 1 thread phụ chờ nhận dữ liệu (khởi tạo hàm truyền nhận data - bất đồng bộ).
    Khi client ngắt kết nối sẽ xảy ra lỗi ở thread phụ này lúc này server bắt lỗi và thông báo về cho các client còn lại.

    Bạn nên trình bày code theo quy định diễn đàn nhé.
    Chúc may mắn.

  5. #5
    Ngày gia nhập
    11 2012
    Bài viết
    8

    Trích dẫn Nguyên bản được gửi bởi Quy_ny Xem bài viết
    Bên server bạn phải tạo 1 thread chính chờ các client kết nối vào.
    Sau khi có client kết nối vào thì tạo 1 thread phụ chờ nhận dữ liệu (khởi tạo hàm truyền nhận data - bất đồng bộ).
    Khi client ngắt kết nối sẽ xảy ra lỗi ở thread phụ này lúc này server bắt lỗi và thông báo về cho các client còn lại.

    Bạn nên trình bày code theo quy định diễn đàn nhé.
    Chúc may mắn.
    mình trình bày cụ thể hơn chút
    ở server mình có classs MainMultiThread là thread chính để lắng nghe client

    Java Code:
    1. public class MainMultiThread {
    2.     // Declaration section:
    3.     // declare a server socket and a client socket for the server
    4.     // declare an input and an output stream
    5.    
    6.     static  Socket clientSocket = null;
    7.     static  ServerSocket serverSocket = null;
    8.  
    9.     // This chat server can accept up to 100 clients' connections
    10.  
    11.     static  clientThread t[] = new clientThread[100];          
    12.    
    13.     public static void main(String args[]) {
    14.        
    15.         // The default port
    16.    
    17.         int port_number=2222;
    18.        
    19.         if (args.length < 1)
    20.         {
    21.             System.out.println("Usage: java MultiThreadChatServer \n" + "Now using port number="+port_number);
    22.         } else {
    23.             port_number=Integer.valueOf(args[0]).intValue();
    24.         }
    25.        
    26.         // Connect socket
    27.         try {
    28.             serverSocket = new ServerSocket(port_number);
    29.         }
    30.         catch (IOException e) {    
    31.             System.out.println(e);
    32.         }
    33.        
    34.         //Connect database
    35.         connectDB con=new connectDB();
    36.         con.ConnectMySQL("smas","root","abc@123");
    37.        
    38.         // Listening socket
    39.         while(true){
    40.             try {
    41.                 clientSocket = serverSocket.accept();
    42.                 for(int i=0; i<=99; i++){
    43.                     if(t[i]==null)
    44.                     {
    45.                         System.out.println("new client connected");
    46.                         (t[i] = new clientThread(clientSocket,t,i)).start();
    47.                         break;
    48.                     }
    49.                 }
    50.             }
    51.             catch (IOException e) {            
    52.                 System.out.println(e);
    53.             }
    54.         }
    55.     }
    56. }

    Mỗi client kết nối đến sẽ được quản lý bởi thread phụ clientThread

    Java Code:
    1. class clientThread extends Thread{
    2.    
    3.     DataInputStream is = null;
    4.     PrintStream os = null;
    5.     Socket clientSocket = null;
    6.     clientThread t[];
    7.     int myI;
    8.     boolean connected = true;
    9.    
    10.     public TestClient objTestClient = new TestClient();
    11.    
    12.     public clientThread(Socket clientSocket, clientThread[] t, int myI){
    13.     this.clientSocket=clientSocket;
    14.         this.t=t;
    15.         this.myI=myI;
    16.     }
    17.    
    18.     public void run()
    19.     {
    20.         String strFromClient = "";      
    21.        
    22.         try{
    23.             is = new DataInputStream(clientSocket.getInputStream());
    24.             os = new PrintStream(clientSocket.getOutputStream());
    25.          
    26.             while (connected) {
    27.                
    28.                 try{
    29.                     strFromClient = is.readLine();
    30.                     if (strFromClient == null)
    31.                     {
    32.                         System.out.println("Client Disconnected!");
    33.                         connected = false;
    34.                     }
    35.                     else
    36.                     {
    37.                         System.out.println("String from client: "+ strFromClient);
    38.                     }
    39.                 }
    40.                 catch(java.net.SocketTimeoutException e) {
    41.                     System.out.println("Timed out trying to read from socket");
    42.                 }
    43.             }        
    44.         }
    45.         catch(IOException e){
    46.             System.out.println("FAIL");
    47.         };
    48.     }
    49. }

    Như thế đã đúng quy trình bạn nói rồi đúng ko? nhưng mình tắt client vẫn ko thấy server in ra gì hết ! bạn có thể edit giúp mình được ko ?

  6. #6
    Ngày gia nhập
    03 2012
    Bài viết
    41

    Mặc định Làm sao biết client ngắt kết nối với Server trong Java??

    theo tôi thì trong java có các sự kiện windowClosing và windowClosed
    bạn dựa vào sự kiện này khi người dùng tắt form hay ngắt form thì bạn gửi thông báo đến sever là được(tôi chưa thử tắt máy ngang can thiệp từ phần cứng).

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

    Mình không biết nhiều về phần này nhưng đọc thấy hay hay và có thắc mắc rằng, bên client ngắt kết nối thì không thể gửi thông báo j tớ server đc nên muốn để server biết mỗi khi có 1 client bị ngắt thì cần xử lí vấn đề đưa ra thông báo ngay tại bên phía server. Theo mình thì trong mỗi luồng đc tạo ra trên server (luồng dùng để xử lí ứng với mỗi client) bạn sẽ ném ra thông báo mỗi khi client liên kết với luồng đó mất chứ ko xử lí việc thông báo ngắt kết nối trên client. Mình chưa tìm hiểu phần này nên chỉ đưa ra ý kiến chủ quan mong các bạn cho ý kiến thêm .

  8. #8
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Thử với SocketOptions SO_KEEPALIVE xem

    Trích dẫn Nguyên bản được gửi bởi Oracle
    When the SO_KEEPALIVE option is enabled the operating system may use a keep-alive mechanism to periodically probe the other end of a connection when the connection is otherwise idle. The exact semantics of the keep alive mechanism is system dependent and therefore unspecified.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  9. #9
    Ngày gia nhập
    10 2010
    Nơi ở
    Thái Bình
    Bài viết
    13

    Bạn cần set timeout cho socket. Nên chủ động gửi bản tin ping khi không có dữ liệu cần gửi đi, quá thời gian timeout mà không nhận được bản tin thì socket đã die.

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

  1. Lập trình socket trong Java, 1 server kết nối nhiều client trong Java như thế nào?
    Gửi bởi detective009 trong diễn đàn Thắc mắc lập trình Java
    Trả lời: 12
    Bài viết cuối: 27-10-2013, 12:53 AM
  2. Làm thế nào để gửi 1object từ 1 server đến nhiều client sử dụng socket trong Java
    Gửi bởi manhtoan2211 trong diễn đàn Công cụ, ebooks Java
    Trả lời: 1
    Bài viết cuối: 10-05-2013, 04:53 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. 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
  5. Socket nhận biết client ngắt kết nối hay chưa trong lập trình C#?
    Gửi bởi thanhhai2306 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 02-12-2011, 11:50 PM

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