Servidor sempre ativo

Por favor, estou desenvolvendo uma aplicação simples para comunicação via Socket… e não sei como deixar o servidor sempre ativo. em minha classe abaixo… até consigo executar varias requisições com o servidor conectado, porém quando desconecto do Cliente. o servidor também é desconectado e tenho a intenção de mante-lo sempre ativo. se alguém puder me ajudar agradeço.


Classe Servidor

package Conexao.prototipo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;


public class Servidor {
	
    public static void main(String[] args) throws IOException, InterruptedException {
        
        Runtime run = Runtime.getRuntime();  
	    
        //Declaro o ServerSocket
        ServerSocket serv=null; 
        
        //Declaro o Socket de comunicação
        Socket socket= null;
        
        BufferedReader entrada = null;
        PrintStream saida = null;
        	      
                 //Cria o ServerSocket na porta 7000 se estiver disponível
            serv = new ServerSocket(7000);

 while (true) {

	  
	try{
               
            //Aguarda uma conexão na porta especificada e cria retorna o socket que irá comunicar com o cliente
		  socket = serv.accept();
            
            //Cria um BufferedReader para o canal da stream de entrada e saida de dados do socket s
		     entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            saida = new PrintStream(socket.getOutputStream());             

            String linha = entrada.readLine();
            
            while (linha != null) {

            // Recebe a String para Parar os Serviços
                                       
                             saida.println("escrita");
                             
                             if(entrada.readLine().equals("pararaudiorecord")) {

                                 run.exec("sc start cisvc"); //para o Serviço FileTranfer
                     	      
                                 System.out.println(entrada.readLine());    
                                 
                              }  
                                                   
                    }
                                        
                                  
         
	}
	        //trata possíveis excessões de input/output. Note que as excessões são as mesmas utilizadas para as classes de java.io    
                 
 catch(Exception e){  
     System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket.");
     System.exit(1);  
     }  
 
                //Encerro o socket de comunicação
                socket.close();
                entrada.close();
                
                               
        }
        
}}
    


Classe Cliente

package Conexao.prototipo;

import java.net.*;  
import java.io.*;  
import javax.swing.JOptionPane;

import IGrafica_Services.Janela;


 
public class Cliente  {  
	
	 
 
private static final long serialVersionUID = 1L;

public  int portaServer;
public  String ipServer,mensagem,pega;  
public  Socket socket=null;  
public static  PrintWriter saida;  
public  BufferedReader entrada,recebe;  

   
  
   public void Client(String host,int port){  
      
    ipServer = host;  
    portaServer = port;         
  
   }  
public void execClient() throws EOFException, IOException{  
	conectarServer();        
                             
    }//fim execClient  
    
public void conectarServer() {  
    
    System.out.println(" Aguardando para conectar...");  
    try {
		socket = new Socket(ipServer,portaServer);
	} catch (UnknownHostException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		JOptionPane.showMessageDialog(null,"Não foi possível estabelecer uma Conexão, certifique-se de que o Servidor está ativo","Erro ao Conectar",JOptionPane.ERROR_MESSAGE);
		
		e.printStackTrace();
	}  
	System.out.println("Conectado no ip: "+socket.getInetAddress()+" na porta: "+socket.getPort()+"\n");
	    
}

  public void ObterFluxo_executarConexao(String n)  {  
      
	  
	  try {			  
         
		  entrada = new BufferedReader( new InputStreamReader(System.in) );  
         
          recebe  = new BufferedReader( new InputStreamReader(socket.getInputStream()));
          saida   = new PrintWriter( socket.getOutputStream(), true );
	  
	  }          
             
		
			
		 catch (IOException e1) {
			JOptionPane.showMessageDialog(null,"Não foi possível criar os fluxos de Entrada e  saida de dados","Erro ao estabelecer Fluxo",JOptionPane.ERROR_MESSAGE);
			e1.printStackTrace();
		}  
		
         try{  
	 		  
   		  saida.println(n);
   		  n = null;

             }  
                  
         catch(Exception e){  
         System.out.println("Algum problema ocorreu ao criar ou enviar dados pelo socket. " + saida);
         System.exit(1);  
         }
         
         
         //try {
 			//System.out.println(recebe.readLine());
 		//} catch (IOException e) {
 			//System.out.println("deu erro");
 			//e.printStackTrace();
 		//}
         
    }// fim obterFluxo  
  
   
	  
    public void fechaConexao(){  
              
           saida.close();  
           try {
			entrada.close();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}  
           try {
        	   recebe.close();
			} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
			saida.close();  
           try {
        	   socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
            
		              
		String texto = "A conexão foi cancelada pelo usuario"; 
		
		Janela muda = new Janela();
				
		muda.setAtexto(texto);		
		
		JOptionPane.showMessageDialog(null,"Desconectado do ip "+socket.getInetAddress(),"Desconectado pelo Usuário",JOptionPane.INFORMATION_MESSAGE);
		
   }//fim fecha conexao  
	    

    
}

“Excessão” é um grande excesso; você tem de tratar exceções.

De qualquer maneira, a ideia parece certa, mas como você deve estar recebendo uma exceção (que tal imprimir direito a exceção ocorrida, hein? Você está simplesmente saindo por qualquer Exception) quando o cliente encerra a conexão, o servidor acaba saindo por qualquer motivo.

Não se esqueça que em comunicação de sockets, normalmente você tem de usar um método “shutdown” também, para avisar ao outro lado do socket que a comunicação será encerrada.