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