Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    26

    [JAVA] "Address already in use: JVM_Bind" e socket che si chiudono...

    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");}
    	}
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    26
    Ho scoperto il perchè di java.net.BindException: Address already in use: JVM_Bind; ho dichiarato il serversocket dentro il while(true)!

    Solo che ora rimane un problema... Io faccio passare dal gestore la stringa "gestore" per farsi identificare dal server magazzino come gestore appunto, solo che ho verificato che in "String c" viene salvato il file xml da passare! Quindi il thread_gestore non viene avviato mai... Come posso organizza i due flussi di dati? (stringa di riconoscimento e trasferimento xml). Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.