Socket serwer - klient dostępny?

0

Witam, napisałem sobie w Javie dwie aplikacje socketowe, serwer i klient.
Wszystko działa dobrze, ale chciałbym dodać do tego ciągłe sprawdzanie czy dany klient jest podłączony do serwera, i jeśli się rozłączył to wysłanie stosownej wiadomości wszystkim pozostałym klientom. Aktualnie mam to zrobione tak, że klient po naciśnięciu "X"(zamknięciu okna) wysyła wiadomość "exit" do serwera, i ten wtedy notuje, że dany klient się rozłączył. Lecz zdarza się, że wiadomość się nie wysyła, np. gdy zamknę proces aplikacji.

Kod serwera(nie cały):

public class Server extends JFrame implements ActionListener, KeyListener 
{  
    private static final int PORT = 50000;  
    static boolean flaga = true; 
    
    static JPanel GUI = new JPanel();
    
    static JTextArea panel = new JTextArea();
    static JTextField komenda = new JTextField();
     
    private static ServerSocket serverSocket = null;
    
    static String wyslij=null;
    static String IP;
    JButton SendCommand;
    static Socket incoming;
    static int clients;
    static int inpC;
    static int wysC;
    static String wysl;
    static String inpu;
    static String nameC;
    static String nameOC;
      
    public static void main(String[] args) throws IOException  
    {  
    	try
    	{
			  InetAddress ownIP=InetAddress.getLocalHost();
			  IP=ownIP.getHostAddress();
		}
    	catch (Exception e)
    	{
			  //
		}
		new Server();
		try
		{
	        try  
	        {  
	            serverSocket = new ServerSocket(PORT);  
	        }  
	        catch(IOException e)  
	        {  
	        	panel.setText(panel.getText()+"***Nie mogę nasłuchiwać na porcie: "+PORT+"\n");  
	            System.exit(1);  
	        }  
	          
	        while(true)
	        {
		        //panel.setText(panel.getText()+"***Oczekuję na połączenie...\n");  
		        incoming = serverSocket.accept();
		        clients++;
		        new Thread()
		    	{
		    		public void run()
		    		{
		    			try
		    			{
					        String name="Serwer";
					        String clientName="";
					        String oldClientName;
					        InputStream inStream = incoming.getInputStream();
				            OutputStream outStream = incoming.getOutputStream();
				            
				            
				            Scanner in = new Scanner(inStream);
				            PrintWriter out = new PrintWriter(outStream, true); 
				            String iIP=""+incoming.getInetAddress();
				            String lIP=""+incoming.getLocalAddress();
				            iIP=iIP.replace('/', ' ');
				            lIP=lIP.replace('/', ' ');
				            panel.setText(panel.getText()+"***Połączono z" + iIP + " na porcie "
				                    + incoming.getPort() + " do portu " + incoming.getLocalPort() + " z"
				                    + lIP+"\n");
				            
				            out.println("");
				            try  
				            {                  
				                while(true)  
				                {   
				                	out.println("");
				                	if(in.hasNextLine())
				                	{
					                    String input = in.nextLine();  
					                    if(inpu!=null && inpu.length()>0)
					                    {
					                    	if(inpC<clients-1)
					                    	{
					                    		inpC++;
					                    		if (inpu.equals("exit") || inpu.equals("disconnect"))
							                    {
							                        out.println(nameC+" opuścił serwer.\n");
							                    }
							                    else if(inpu.contains("name") && !inpu.contains("qname") && (inpu.substring(5,inpu.length())).length()>3)
							                    {
							                    	out.println("***"+nameOC+" zmienił nick na "+nameC+".");
							                    }
							                    else if(!inpu.contains("qname"))
							                    {
							                    	out.println(nameC+": "+inpu);
							                    }
					                    	}
					                    	else
					                    	{
					                    		inpC=0;
					                    		inpu=null;
					                    		nameC=null;
						                    	nameOC=null;
					                    	}
					                    }
					                    if(wysl!=null && wysl.length()>0)
					                    {
					                    	if(wysC<clients-1)
					                    	{
					                    		wysC++;
					                    		if(wysl.contains("name") && !wysl.contains("qname") && (wysl.substring(5,wysl.length())).length()>3 && (wysl.substring(5,wysl.length())).length()<20)
							                    {
					                    			out.println("***"+name+" zmienił nick na "+wysl.substring(5,wysl.length())+".");
							                    	name=wysl.substring(5,wysl.length());
							                    }
					                    		else if(!wysl.contains("qname"))
							                    	out.println(name+": "+wysl+"\n");
					                    	}
					                    	else
					                    	{
					                    		wysC=0;
					                    		wysl=null;
					                    	}
					                    }
					                    if(input!=null && input.length()>0)
					                    {
					                    	inpu=input;
					                    	nameC=clientName;
					                    }
					                    if(wyslij!= null && wyslij.length() > 0)
					                    	wysl=wyslij;
					                    if (input.equals("exit") || input.equals("disconnect"))
					                    {
					                        panel.setText(panel.getText()+"***"+clientName+"("+iIP+")"+" opuścił serwer.\n");
					                        clients--;
					                        input=null;
					                        stop();
					                        in.close();
					                        out.close();
					                        incoming.close();
					                        return;
					                    }
					                    if(input!=null && input.contains("qname") && (input.substring(6,input.length())).length()<20 && (input.substring(6,input.length())).length()>3)
					                    {
					                    	oldClientName=clientName;
					                    	clientName=input.substring(6,input.length());
					                    	nameC=clientName;
					                    	nameOC=oldClientName;
					                    	input=null;
					                    }
					                    else if(input!=null && input.contains("name") && (input.substring(5,input.length())).length()>3 && (input.substring(5,input.length())).length()<20)
					                    {
					                    	oldClientName=clientName;
					                    	clientName=input.substring(5,input.length());
					                    	panel.setText(panel.getText()+"***"+oldClientName+" zmienił nick na "+clientName+".\n");
					                    	out.println("***"+oldClientName+" zmienił nick na "+clientName+".");
					                    	nameC=clientName;
					                    	nameOC=oldClientName;
					                    	input=null;
					                    }
					                    if(input!=null && input.length()>0)
					                    {
					                    	panel.setText(panel.getText()+clientName+": "+input+"\n");
					                    	out.println(clientName+": "+input);
					                    }
					                    if(wyslij!=null && wyslij.contains("name") && (wyslij.substring(5,wyslij.length())).length()>3 && (wyslij.substring(5,wyslij.length())).length()<20)
					                    {
					                    	panel.setText(panel.getText()+"***"+name+" zmienił nick na "+wyslij.substring(5,wyslij.length())+".\n");
					                    	name=wyslij.substring(5,wyslij.length());
					                    	wyslij=null;
					                    }
					                    if(wyslij!= null && wyslij.length() > 0)
					                    {
					                    	out.println(name+": "+wyslij+"\n");
					                    	panel.setText(panel.getText()+name+": "+wyslij+"\n");
					                      	wyslij=null;
					                    } 
					                    String atext=panel.getText();
					                    String[] aatext=atext.split("\n");
					                    int caatext=aatext.length;
					                    if(caatext>25)
					                    {
					                    	panel.setText("");
					                    	int toDelete=caatext-25;
					                    	for(int i=0;i<toDelete;i++)
					                    		aatext[i]="***DELETE***";
					                    	for(int i=0;i<caatext;i++)
					                    	{
					                    		if(!aatext[i].equals("***DELETE***"))
					                    		{
					                    			String txt=""+aatext[i];
					                    			String[] txt2=txt.split("\n");
					                    			if(txt2[0].contains("\n"))
					                    				panel.setText(panel.getText()+txt2[0]);
					                    			else
					                    				panel.setText(panel.getText()+txt2[0]+"\n");
					                    		}
					                    	}
					                    }
				                	}
				                	Thread.sleep(50);
				                }
				            }  
				            catch(InterruptedException ie)  
			                {  
			                    //  
			                } 
				            finally
				            {
				            	panel.setText(panel.getText()+"Rozłączono\n");
				            	incoming.close();
				            }     
		    			}
		    			catch (IOException e)
				        {
				    		e.printStackTrace();
				        }
		    		}
		    	}.start();
	        }
		}
		catch (IOException e)
        {
    		e.printStackTrace();
        }
    }
}  

Próbowałem sam dodawać takie sprawdzanie, ale nie chciało mi to za bardzo działać.

Proszę o przykłady jak to zrobić lub dodanie własnego kodu do tego podanego przeze mnie wyżej.

1

Straszny kod :O

Wykorzystaj to co masz:
if(inpu!=null && inpu.length()>0)
Jeśli ten warunek nie został spełniony to znaczy, że zamknięto socket.

1 użytkowników online, w tym zalogowanych: 0, gości: 1