salve a tutti.. spero fortemente in un vostro aiuto perchè sono bloccato su questo problema da un po di tempo.
vi spiego: ho una classe server che appunto funziona da server, e che salva in una lista tutti i client che si connettono. quando tra i client, si connette uno con il nome di amministratore, il server gestisce una comunicazione a parte con lui. questo client amministratore ha un'interfaccia grafica dalla quale l'utente può connettersi al server e può eseguire alcune operazioni. per ora ho implementato solo una stampa di tutti i client connessi.
l'applicazione gira bene finche il client amministratore si connette, esegue la stampa dei client connessi e poi però non però perchè chiude la connessione, quando invece io vorrei che la connessione rimanga aperta per altre operazioni che l'utente vuole fare.
vi allego i vari sorgenti sperando che possiate aiutarmi! grazie
codice:
package server;

import java.io.*;
import java.net.*;
import java.util.Iterator;
import utilities.ConstantType;
import utilities.ListaClient;
import utilities.Struttura;

class GestoreClient extends Thread{
	ListaClient list ;
	Socket s;
	String user;
	
	public GestoreClient(ListaClient list, Socket s,String u){
		this.list = list;
		this.s = s;
		this.user=u;
	}
	
	public void run() {
		System.out.println(" Aggiungo il client alla lista...");
		Struttura client = new Struttura(user);
		
		//setto ip,port e la socket
		System.out.println(" Setto i valori della porta,ip e socket del client connesso....");
		client.setIp(s.getInetAddress().getHostAddress());
		client.setPort(s.getPort());
		client.setSocket(s);
		
		//popolo la struttura
		System.out.println(" Popolo la lista...");
		boolean b=list.add(client);
		
		System.out.println(" CLIENT INSERITO NELLA STRUTTURA : " + b);
		System.out.println("");
		System.out.println(" CLIENT CONNESSI : "+list.contaClient());
		System.out.println("");
		System.out.println("Ultimo client connesso: ");
		System.out.println("User: "+user);
		System.out.println("Port: "+client.getPort());
		System.out.println("IP: "+client.getIp());
		System.out.println("");
		System.out.println("STAMPA LISTA");
		list.Stampa();
	}
}

class GestoreAdmin extends Thread{
	
	private Socket socket;;
	private ListaClient list;
	
	public GestoreAdmin(Socket s,ListaClient l) {
		this.socket=s;
		this.list=l;
	}
	
	public void run(){
		BufferedReader in;
		PrintWriter out;
		try {
		in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		out=new PrintWriter(socket.getOutputStream());
		while(true){
			System.out.println("Sto nel thread del client_admin...");
			String msg=null;
			System.out.println(" Attendo messaggio dal Client_Admin...");
			System.out.println(" connessione chiusa? "+socket.isClosed());
			while((msg=in.readLine())!=null){
				System.out.println(" connessione chiusa? "+socket.isClosed());
				System.out.println("entro nel while");
				if(msg.equals("esegui")){
					System.out.println(" connessione chiusa? "+socket.isClosed());
					System.out.println(" Ho ricevuto "+msg+"...");
					System.out.println(" Preparo la stampa dei client connessi al server...");
					Iterator<Struttura> it = list.Iterator();	
					while(it.hasNext()){
						out.println(it.next().getUser());
						out.flush();
					}
					System.out.println(" connessione chiusa? "+socket.isClosed());
					System.out.println(" Ho effettuato la stampa dei client connessi al server...");
					//out.close();
					System.out.println(" connessione chiusa? "+socket.isClosed());
				}
				if(msg.equals("refresh")){
					System.out.println(" Effettuo il refresh..");
				}
			}
		}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
}

public class Server {

	public static void main(String[] args) throws IOException {

		ServerSocket ss = new ServerSocket(ConstantType.PORT);
		System.out.println(" SERVER LANCIATO");
		ListaClient list = new ListaClient();
		
		//il server aspetta sempre una connessione.Quando un client si connette,viene lanciato un 
		//Thread a cui fornisco la socket e la lista dei Client gia connessi
		
		while(true){
			System.out.println(" Attendo la connessione di qualche utente");
			Socket s = ss.accept();
			System.out.println(" Ho eseguito la accept");
			
			BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			//PrintWriter out=new PrintWriter(s.getOutputStream());
			System.out.println(" Ho aperto un buffer in in e out");
			
			System.out.println(" Leggo l'input");
			String user = br.readLine();
			
			if(user.equals("administrator")){
				GestoreAdmin ga=new GestoreAdmin(s,list);
				ga.start();
			}else{
				GestoreClient g = new GestoreClient(list,s,user);
				g.start();
			}
			System.out.println(" ho finito il main...");
		}		
	}
}
codice:
public class provaPresentazioneClientAdmin extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jPanel = null;
	private JLabel jLabel = null;
	private JButton enter = null;
	private JProgressBar jProgressBar = null;
	private JLabel jLabel1 = null;
	private JPanel jPanel1 = null;  //  @jve:decl-index=0:visual-constraint="676,53"
	private JLabel jLabel2 = null;
	private JButton esegui = null;
	
	private JPanel jPanel2 = null;
	private JButton refresh = null;
	private JLabel listlabel = null;
	private JList listclient = null;
	
	private Socket clientAdmin;
	private BufferedReader in=null;
	private PrintWriter out=null;
	
	public provaPresentazioneClientAdmin() {
		super();
		initialize();
	}
	private void initialize() {
		
		this.setSize(657, 505);
		this.setResizable(false);
		this.setContentPane(getJPanel());
		this.setTitle("Client_Administrator");
	}
	
	private  void initialize1() {
		
		this.setSize(657, 505);
		this.setContentPane(getJPanel1());
		this.setTitle("seconda finestra");
	}
	private JPanel getJPanel() {
		if (jPanel == null) {
			
			jLabel1 = new JLabel();
			jLabel1.setBounds(new Rectangle(0, 5, 649, 47));
			jLabel1.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
			jLabel1.setHorizontalTextPosition(SwingConstants.CENTER);
			jLabel1.setFont(new Font("Edwardian Script ITC", Font.ITALIC, 36));
			jLabel1.setText("Welcome to Client Administrator");
			jLabel = new JLabel(new ImageIcon("C:\\Documents and Settings\\Matteo\\Documenti\\Downloads\\icona_pc.jpeg"));
			jLabel.setBounds(new Rectangle(53, 60, 558, 319));
			//jLabel.setText("JLabel");
			jLabel.setDisplayedMnemonic(KeyEvent.VK_UNDEFINED);
			jLabel.setIcon(new ImageIcon("C:/Documents and Settings/Matteo/Documenti/Immagini/icona_pc.jpg"));
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(jLabel, null);
			jPanel.add(getEnter(), null);
			jPanel.add(getJProgressBar(), null);
			jPanel.add(jLabel1, null);
		}
		return jPanel;
	}
	private JButton getEnter() {
		if (enter == null) {
			enter = new JButton();
			enter.setBounds(new Rectangle(270, 383, 129, 37));
			enter.setText("Enter");
			enter.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
					try {
						clientAdmin=new Socket("localhost",8080);
						in=new BufferedReader(new InputStreamReader(clientAdmin.getInputStream()));
						out=new PrintWriter(clientAdmin.getOutputStream());
						out.println("administrator");
						out.flush();
						System.out.println("inizia l'amministratore");
						initialize1();	
					} catch (UnknownHostException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
							
				}
			});
		}
		return enter;
	}
	private JProgressBar getJProgressBar() {
		if (jProgressBar == null) {
			jProgressBar = new JProgressBar();
			jProgressBar.setBounds(new Rectangle(201, 428, 249, 14));
		}
		return jProgressBar;
	}
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jLabel2 = new JLabel();
			jLabel2.setBounds(new Rectangle(46, 27, 180, 31));
			jLabel2.setText("Lista dei client connessi");
			jPanel1 = new JPanel();
			jPanel1.setLayout(null);
			jPanel1.setBounds(new Rectangle(0, 0, 657, 474));
			jPanel1.add(jLabel2, null);
			jPanel1.add(getEsegui(), null);

			jPanel1.add(getJPanel2(), null);
			jPanel1.add(getRefresh(), null);
			
		}
		return jPanel1;
	}
	private JButton getEsegui() {
		if (esegui == null) {
			esegui = new JButton();
			esegui.setBounds(new Rectangle(478, 26, 91, 30));
			esegui.setText("Esegui");
			esegui.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed() di esegui.."); // TODO Auto-generated Event stub actionPerformed()
					try {
						System.out.println("creo l'out");
						out.println("esegui");
						out.flush();
						System.out.println("spedisco 'esegui'");
						String name;
						DefaultListModel m=new DefaultListModel();//per mettere i dati da visualizzare nella Jlist
						listclient.setModel(m);
						System.out.println("attendo la risposta dal server");
						while((name=in.readLine())!=null ){
							System.out.println("name: "+name);
							m.addElement(name);
						}	
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			});
		}
		return esegui;
	}
	private JPanel getJPanel2() {
		if (jPanel2 == null) {
			listlabel = new JLabel();
			listlabel.setBounds(new Rectangle(1, 1, 371, 367));
			jPanel2 = new JPanel();
			jPanel2.setLayout(null);
			jPanel2.setBounds(new Rectangle(45, 84, 372, 368));
			jPanel2.add(listlabel, null);
			//jPanel2.add(new JScrollPane(listclient));
			jPanel2.add(getListclient(), new JScrollPane(listclient) );
			listclient.addListSelectionListener(new ListenerListClient());
		}
		return jPanel2;
	}
	private JButton getRefresh() {
		if (refresh == null) {
			refresh = new JButton();
			refresh.setBounds(new Rectangle(479, 61, 90, 32));
			refresh.setText("Refresh");
			refresh.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed() di refresh"); // TODO Auto-generated Event stub actionPerformed()
					out.println("refresh");
					out.flush();
				}
			});
		}
		return refresh;
	}
	private JList getListclient() {
		if (listclient == null) {
			listclient = new JList();
			listclient.setBounds(new Rectangle(1, 1, 372, 368));
		}
		return listclient;
	}	
	private class ListenerListClient implements ListSelectionListener{
		public void valueChanged(ListSelectionEvent e){
			if(e.getValueIsAdjusting()) 
				return;
			String v=(String)listclient.getSelectedValue();
			if(v==null) return;
		}
	}		
}  //  @jve:decl-index=0:visual-constraint="3,45"
questi sono i metodi incriminati.. help please!