2016-04-05 9 views
0

Javaでソケットを使用してチャットアプリケーションをプログラミングしています。私は、クライアントがサーバーに接続しているのと同じくらい何度も呼び出されるこのメソッドを持っています。クライアント側ではソケット - サーバーの切断時にクライアントを切断する


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 

/*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() 


、私はこの


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

new ServerHandler(client, this); 
0のよう ClientInfoオブジェクトを作成します

そして最後に、ServerHandlerは(すべてのコードを貼り付けるために申し訳ありませんが、私はそれをできるだけ多くを凝縮させるために全力をしようとしています)

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() 

私の目標::

ときユーザーがサーバーを停止すると、すべてのクライアントを切断する必要があります。 remove_online_user()の実行中に、ObjectInputStream/ObjectOutputStreamを閉じると、クライアントサーバーハンドラで例外がトリガされます。しかし、現在のところそれはありません。私は間違って何をしていますか?

(私は十分な情報を投稿していなかった場合、私は事前に謝罪、私は4つの全体の.javaファイルと誰もflabbergastしたくないより多くの情報が必要な場合は私に知らせてください)

答えて

0

ソケットを閉じるしますピアのreadObject()メソッドでEOFExceptionをトリガーします。

同じ理由で、読み取りループが無効です。 readObject()は、ストリームの最後にnullを返しません。

+0

私は、EOFExceptionがIOExceptionのサブクラスであり、この例外をトリガーすることを知っています。 readObject()がストリームの終わりにnullを返さないと言ったとき、私はあなたが意味することを理解していませんか?説明していただけますか? – user3487243

+0

私には完全に明確な声明のようです。それのどの部分を理解していないのですか? – EJP

+0

"ストリームの終わりに"私が理解できないものです。どのような理由でnullを返さないのですか?これは私の質問にどう答えますか? – user3487243

関連する問題