2016-04-05 17 views
0

Java'da soketli bir sohbet uygulaması programlıyorum. Sunucuya bağlı istemciler olduğu için birçok kez çağrılan bu yönteme sahibim.Yuvalar - Sunucu bağlantıyı kestiğinde bir istemcinin bağlantısını keser


public class ClientInfo implements Serializable 
{ 
    public ObjectOutputStream writer; 
    public ObjectInputStream reader; 
    public String user_name; 

    public ClientInfo(ObjectOutputStream writer, ObjectInputStream reader, String name) 
    { 
     this.reader = reader; 
     this.writer = writer; 
     this.user_name = name; 
    } 
}//end class 
istemci tarafında


/*Client side code*/ 
    void remove_online_user(ClientInfo client_to_remove) 
     { 
      try 
      { 
       client_to_remove.reader.close(); //this should trigger server handler in client 
       client_to_remove.writer.close(); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
     }//end remove_online_users() 
, bu


client = new ClientInfo(
        new ObjectOutputStream(client_socket.getOutputStream()), 
        new ObjectInputStream(client_socket.getInputStream()), 
        user_name); 

new ServerHandler(client, this); 
0 gibi ClientInfo nesne oluşturmak

Ve nihayet, ServerHandler (bütün kodunuzu yapıştırmak için üzgünüm, ben elimden geleni çalışıyorum bunu mümkün olduğunca yoğunlaşmasına)

class ServerHandler implements Runnable 
{ 
    private ClientInfo server; 
    private ClientBackEnd client_back_end; 


    public ServerHandler(ClientInfo server, ClientBackEnd client_back_end) 
    { 
     this.server = server; 
     this.client_back_end = client_back_end; 
    }//end constructor 


    /*method invoked by start() call in constructor, manages communication between client and server*/ 
    public void run() 
    { 
     try 
     { 
      MessageInfo message; 
      while ((message = (MessageInfo) server.reader.readObject()) != null) 
      { 
       if (message.clients != null) 
       { 
        for (ClientInfo cd : message.clients) 
        { 
         if (client_back_end.listModel.contains(cd)) continue; 
         client_back_end.listModel.addElement(cd); 
        } 

        for (Object cd : client_back_end.listModel.toArray()) 
        { 
         if (message.clients.contains(cd)) continue; 
         client_back_end.listModel.removeElement(cd); 
        } 

       } 
       else 
       { 
        System.out.println("\n" + message.message_contents); 
       } 
      } 
     } 
     catch (ClassNotFoundException | IOException e) 
     { 
      //This should trigger during the execution of remove_online_user(); 
      client_back_end.disconnect_from_server(); 
     } 
    }//end run() 

Amacım ::

kullanıcı sunucuyu durdurur, tüm istemciler kesilmelidir. Remove_online_user() sırasında, ObjectInputStream/ObjectOutputStream öğesinin kapatılması, istemcilerde sunucu İşleyicisi'nde bir istisna tetiklemelidir. Ama şu anda değil. Neyi yanlış yapıyorum?

(Yeterince bilgi göndermek olmasaydı ben şimdiden özür dilerim;. Daha fazla bilgi gerekiyorsa bana bildirin ben 4 tüm .java dosyaları ile kimseyi flabbergast istemiyorum) will soket Kapanış

cevap

0

eşinin readObject() yöntemine bir EOFException tetikleyin.

Aynı nedenle, okuma döngünüz geçersiz. readObject(), akış sonunda boş değer döndürmez.

+0

Hm, EOFException'ın bir IOException alt sınıfı olduğunu ve bu özel durumu tetikleyeceğini biliyorum. ReadObject() akışının sonunda null döndürmediğini söylerken ne demek istediğini anlamıyorum? Açıklayabilir misin? – user3487243

+0

Bana tamamen açık bir ifade gibi görünüyor. Hangi kısmını anlamıyorsun? – EJP

+0

"Akışın sonunda" anlamadığım şeydir. Hangi sebeple boşa dönmez? Bu benim soruma nasıl cevap veriyor? – user3487243

İlgili konular