2015-12-06 4 views
0

Я пытаюсь сделать чат-программу. Проблема, с которой я сталкиваюсь, заключается в том, что моя петля в EchoThread всегда считает, что соединение верно. Я попытался использовать if(s.isConnected() == false), но это не сработало и я попытался сделать if(s.isClosed() == true), если вы можете помочь заблаговременно. Вот мой кодJava Socket Handling Clients Disconnecting

import java.io.*; 
import java.net.*; 
import java.util.ArrayList; 

public class server { 
public ObjectInputStream input; 
public ServerSocket server; 
public Socket s; 
public ObjectOutputStream output; 
public ArrayList<ObjectOutputStream> outputs = new ArrayList<ObjectOutputStream>(); 
public ArrayList<Socket> users = new ArrayList<Socket>(); 
public class Accept implements Runnable { 
    public void run() { 
     try { 
      server = new ServerSocket(55555, 100); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     while(true) { 
      try { 
       s = server.accept(); 
       new EchoThread(s).start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
public class EchoThread extends Thread { 
    private Socket s1; 
    public EchoThread(Socket s) throws IOException { 
     this.s1 = s; 
    } 
    public void run() { 
     users.add(s1); 
     try { 
      outputs.add(new ObjectOutputStream(s1.getOutputStream())); 
      newUser(); 
     } catch (IOException e) { 
      System.out.println("Error 2"); 
     } 
     while(s1.isConnected() == true) { 
      // loops until socket looses connection 
     } 
     System.out.println("Disconnected"); 
     } 
    } 
public class check implements Runnable { 

    public void run() { 
    } 

} 
public void newUser() { 
    try { 
     for(ObjectOutputStream o: outputs) { 
       o.writeObject(s.getInetAddress() + " Connected"); 
     } 
    } catch (IOException e1) { 
     System.out.println("Error 21"); 
    } 
} 
server() throws IOException { 
    Thread t = new Thread(new Accept()); 
    t.start(); 
    Thread ch = new Thread(new check()); 
    ch.start(); 
    } 
public static void main(String[] args) throws IOException { 
    new server(); 
} 
} 

ответ

0
while(s1.isConnected() == true) { 

Это не действительный цикл. isConnected() верно, потому что вы приняли сокет, и это не волшебным образом становится ложным впоследствии. Когда клиент отключается, вы получите соответствующий индикатор конца потока из любого способа чтения, который вы вызываете.