Salve a tutti!
Sto facendo un progettino java diviso in tre parti: un server che gestisce un database mySQL di cd musicali, una interfaccia gui per il gestore del magazzino ed un applet per i client che ne vogliono ordinare delle copie. L'interfaccia gui del gestore (che ho già terminato), invia un xml con i nuovi arrivi del negozio al server(multithread) cche provvederà ad aggiornare il db mysql.
Il mio problema è stato quando ho deciso di far riconoscere il tipo di client (applet di un cliente o gestore) attraverso l'invio di una stringa al server a connessione avvenuta. Oltre a chiudersi inspiegabilemnte la socket dopo l'avvio del thread del gestore mi compare questo errore:
java.net.BindException: Address already in use: JVM_Bind

Grazie per ogni aiuto che mi darete

Alleggo le parti di codice interessate:

questo è il SERVER
codice:
 
import java.net.*;
import java.io.*;
import java.util.Vector;


public class Server_Magazzino{

	public boolean type_Client(Socket socket){
		String c = "err";
		BufferedReader br;
		try{
		br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		c = br.readLine();
		}catch(IOException e){System.out.println(e);}
		if(c.equals("gestore")){
			return true;
		}else{
			return false;
		}

	}

    private void connessione(){
		try{
		while(true){
			ServerSocket serversocket = new ServerSocket(7777); 
			System.out.println("In attesa di chiamata...");
			Socket socket = serversocket.accept();
			//serversocket.setReuseAddress(true);
			if(type_Client(socket)){
				System.out.println("Ho ricevuto una chiamata dal Gestore:" + socket);
				Thread_Gestore threadGestore = new Thread_Gestore(socket);
				threadGestore.start();
			}else{
				System.out.println("Ho ricevuto una chiamata da un Client:" + socket);
				Thread_Client threadClient = new Thread_Client(socket);
				threadClient.start();
			}
		}
		}catch(IOException e){System.out.println(e);}
	}
	public static void main(String args[]){
		Server_Magazzino server =  new Server_Magazzino();
		server.connessione();	
	}
}

questo il THREAD DEL GESTORE (quello del client non lo alleggo in quanto è ancora vuoto):
codice:
class Thread_Gestore extends Thread{
	private Socket socket;
    public Thread_Gestore (Socket socket) {
        this.socket = socket;
	}
	
	public void aggiorna_db(){
	}
	
	public void run(){
		
		try{
		if(!socket.isClosed()){	
		// Creo il file di Output
		ObjectInputStream ois = new ObjectInputStream( socket.getInputStream() );
		FileOutputStream fos = new FileOutputStream( "nuovidati.xml" );
		// Ora ricevo tutti i pacchetti
		byte buffer[];
			try {
				while ( true ) {
					buffer = (byte[]) ois.readObject();
					fos.write( buffer );
				}
			} catch (Exception eofe) {fos.close();}

			// Chiudo il canale della socket (non è necessario data l'Exception precedente)
		ois.close();}else{System.out.println("XML non ricevuto");}
		}catch(IOException e) {System.out.println(e+" run");}
		
	}
}

Questa è la porzione dell'interfaccia del gestore interessata:
codice:
 private void jButton3MouseClicked(java.awt.event.MouseEvent evt) {        //BOTTONE TRASMETTI  
    try{
	
	XML_builder builder = new XML_builder(dati); //Passo il vettore di album

	if(dati.size()==0){
		JOptionPane.showMessageDialog(null,"Non ci sono dati da trasmettere.","Gestore Magazzino",2);
	}
	else if(builder.is_scritto){	
		JOptionPane.showMessageDialog(null,"Dati salvati e pronti per l'invio al Database","Gestore Magazzino",1);
		String IP = JOptionPane.showInputDialog("Inserisci IP del Server del magazzino:");
		int porta = Integer.parseInt(JOptionPane.showInputDialog("Inserisci porta del Server del magazzino:"));
		Socket socket = new Socket(IP, porta);
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		bw.write("gestore");
		//bw.close();
		if(socket.isClosed())System.out.println("socket chiusa");
		//builder.sendXML(socket); //Invio la socket attraverso la quale la funzione sendXML trasmetterà i dati
	}else{
		JOptionPane.showMessageDialog(null,"Errore nella creazione dei dati da trasmettere!","Gestore Magazzino",0);
	}
	
	
	}catch(UnknownHostException e){JOptionPane.showMessageDialog(null,"IP sconosciuto!","Gestore Magazzino",0);}
	catch(IOException e){JOptionPane.showMessageDialog(null,"ERRORE","Gestore Magazzino",0);}
	catch(NumberFormatException e){JOptionPane.showMessageDialog(null,"La Porta è un numero intero!","Gestore Magazzino",0);}
	catch(IllegalArgumentException e){JOptionPane.showMessageDialog(null,"Il range delle porte è 1-65535!","Gestore Magazzino",0);}
}

Classe che gestisce la creazione e l'invio dell'xml:
codice:
 public class Gestore_XML{
	private Vector dati = new Vector(0);
	private String codice_XML;
	public static boolean is_scritto = false;
	
	public Gestore_XML(Vector dati){
		try{
		this.dati = dati;
		codice_XML = creaScritta(creaArtVector(), dati);
		creaFile(codice_XML);
		is_scritto = true;
		}catch(IOException e){JOptionPane.showMessageDialog(null,"Errore nella creazione dell'xml","Gestore Magazzino",0);}
		
	}
	
	private Vector creaArtVector(){ //CREA IL VECTOR CON GLI ARTISTI
		int i,j;
		Vector artVector = new Vector(0);
		for(i=(dati.size()-1); i>=0;i-- ){
			Album album =(Album)dati.get(i);
			for(j=(artVector.size()-1); j>=0;j-- ){   //Confronto l'elemento di album con quelli di artVector
				String art =(String)artVector.get(j);
				if(art.equals((String)album.getArtista())){
					break;
				}
			}
			if(j<0){artVector.add((String)album.getArtista());} //Se non ha trovato match, adda l'artista a artVector
		}
		return artVector;
	}
	
	
	private String creaScritta(Vector artVector, Vector dati){
		int i, j;
		String scritta="";
		scritta+="<?xml version=\"1.0\"?>";
		scritta+="<root>";
		for(i=(artVector.size()-1);i>=0;i--){
			String artista = (String)artVector.get(i);
			scritta+="<artist name=\""+artista+"\">";
			for(j=(dati.size()-1);j>=0;j--){
				Album artista2 = (Album)dati.get(j);
				if(artista.equals((String)artista2.getArtista())){
					scritta+="<album titolo=\""+artista2.getTitolo()+"\">";
					scritta+="<anno>"+artista2.getAnno()+"</anno>";
					scritta+="<copie>"+artista2.getCopie()+"</copie>";
					scritta+="<prezzo>"+artista2.getPrezzo()+"</prezzo>";
					scritta+="</album>";
				}
			}
			scritta+="</artist>";	
		}
		scritta+="</root>";
		return scritta;
	}	
	
	private void creaFile(String scritta) throws IOException,FileNotFoundException{
		try{
		boolean is_scritto=false;
		FileWriter writer=new FileWriter("Nuovi_Dati.xml");
		writer.write(scritta);
		writer.close();
		is_scritto=true;
		}catch(IOException e){JOptionPane.showMessageDialog(null,"Errore nella creazione dell'xml","Gestore Magazzino",0);}
	}
	
	public void sendXML(Socket s){
	try{
		// Mi preparo per leggere il file da inviare (come file binario)
		ObjectOutputStream oos = new ObjectOutputStream( s.getOutputStream() );	
		FileInputStream fis = new FileInputStream("nuovidati.xml");

		// Lo invio, a blocchi di 4 kb al massimo
		byte [] buffer = new byte[4096];
		byte [] bufOut;
		int len = 0;
		while((len = fis.read(buffer)) > 0) {
			if (len < 4096) {
			bufOut = new byte[len];
			for(int i=0; i<len; i++) bufOut[i] = buffer[i];
		} else {
			bufOut = (byte[]) buffer.clone();
		}
		oos.writeObject( bufOut );
		oos.flush();
		}

		// Chiudo il file e il canale della socket
		fis.close();
		oos.close();
		}catch(IOException e){JOptionPane.showMessageDialog(null,"Errore nell'invio dei dati","Gestore Magazzino",0);System.out.println("DIO");}
	}
}