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

Rispondi quotando