Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1

    [JAVA] Far sì che il mio server ascolti piu' client e diventi quindi multithread

    Ciao ragazzi,
    vi chiedo umilmente aiuto ancora una volta
    Ho un Server Monothread che puo ascoltare una sola connesione per volta, dopodichè si disconnette. Vorrei che potesse essere sempre in ascolto ed ascoltare al contempo piu' client, quindi credo debba diventare multhitread.
    Vi spiego in breve il programma:
    Il lato client, è un cronometro che deve misurare le ore di lavoro di alcune operatrici di call center, il server invece è un monitor che serve alla responsabile di sala per controllare la data di log in, quella di log out, ed eventuali pause delle ragazze.

    il client è un semplice jpanel con 2 textfiel ed un jPasswordfield che creano una login sotto forma di una stringa di parole intervallate da puntini (nome.password.postazione_telefonica.) la invia al server. Il server sminuzza questa informazione grazie ad una string tokenizer, e le usa per creare l'oggetto Operatore (Telefonico) solo nel caso in cui tale stringa di login sia equivalente ad una di quelle salvate nel file excel listalogin.
    Se corrisponde, si crea l'oggetto Operatore, nella Jtable del server si stampano le info dell'Operatore connesso e il server invia una risposta al client "OK" il client la legge e fa scattare il cronometro delle Operatrici Telefoniche.

    Il mio server monothread funziona bene, fa tutto quello che deve fare,
    Sostanzialmente è un monitor che deve visualizzare tutti i client connessi (proprio come una chat ma senza invio di messaggi istatanei), che possa salvare la data e l'ora di connessione e quella di disconnessione.

    Il mio problema è il seguente: da quando ho provato a implementare il multithreading sul mio programma, questo è impazzito, attivando un loop infinito che crea delle GUI del server una dietro l'altra, questo solo dopo aver riconosciuto la login, e questa viene riconosciuta perfettamente come pure il file excel viene letto perfettamente.
    vi posto il codice monothread funzionante e quello multithread non perfettamente funzionante
    VI PREGO UMILMENTE AIUTATEMI PERCHE' MI SONO SCOCCIATO DI STARE SU QUESTO CODICE E VOGLIO IMPLEMENTARE ALTRO.

    P.S. Scusate i println di controllo visuale che ho fatto qua e la e scusate la tecnica di programmazione pessima, ma programmo a oggetti da pochissimo, vi prego aiutatemi

    POSTO NEI SUCCESSIVI COMMENTI IL CODICE POICHE' LUNGO

  2. #2

    SERVER MONOTHREAD FUNZIONANTE

    import java.awt.EventQueue;

    import javax.swing.JFrame;

    import javax.swing.JPanel;

    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JButton;
    import javax.swing.JLabel;

    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.StringTokenizer;

    import jxl.Cell;
    import jxl.LabelCell;
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.read.biff.BiffException;
    import javax.swing.SwingConstants;
    import java.awt.Font;
    import java.awt.Color;


    public class LudecaLogInServer {

    private JFrame frmLudecaLoginServer;
    private static JTable table = new JTable();
    private JPanel panel_1;

    static JTextArea schermoLog = new JTextArea();

    static BufferedReader in ;
    static DataOutputStream out;

    static ServerSocket serverSocket = null;
    static Socket clientSocket = null;

    static String[] nomiColonne = new String[] {"OPERATORE", "DATA LOG-IN",
    "TELEFONO", "PAUSA", "N\u00B0 PAUSE"};

    static String[][] valoriCelle = new String[][] {
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    {null, null, null, null, null},{null, null, null, null, null},{null, null, null, null, null},
    };

    final static DefaultTableModel modelloTabella = new DefaultTableModel(valoriCelle, nomiColonne);

    /**
    * Launch the application.
    */
    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
    public void run() {
    try {
    LudecaLogInServer window = new LudecaLogInServer();
    window.frmLudecaLoginServer.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    });

    attivaConnessioneServer();
    accettaConnessioneClient();
    /*String ascoltoDelServer=new String("ON");

    while ( ascoltoDelServer.equals("QUIT")==false && ascoltoDelServer.equals(null)==false)
    {
    try {
    System.out.println("ascolto1= "+ascoltoDelServer);
    ascoltoDelServer = in.readLine();
    LudecaLogInServer.accettaConnessioneClient();
    System.out.println("ascolto2= "+ascoltoDelServer);
    }

    catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    ascoltoDelServer="ON";*/
    disconnettiServer();

    }

    /**
    * Create the application.
    */
    public LudecaLogInServer() {
    initialize();
    }

    /**
    * Initialize the contents of the frame.
    */
    private void initialize() {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
    * For details see http://download.oracle.com/javase/tu...feel/plaf.html
    */
    try {
    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
    if ("Nimbus".equals(info.getName())) {
    javax.swing.UIManager.setLookAndFeel(info.getClass Name());
    break;
    }
    }
    } catch (ClassNotFoundException ex) {
    java.util.logging.Logger.getLogger(LudecaLogInServ er.class.getName()).log(java.util.logging.Level.SE VERE, null, ex);
    } catch (InstantiationException ex) {
    java.util.logging.Logger.getLogger(LudecaLogInServ er.class.getName()).log(java.util.logging.Level.SE VERE, null, ex);
    } catch (IllegalAccessException ex) {
    java.util.logging.Logger.getLogger(LudecaLogInServ er.class.getName()).log(java.util.logging.Level.SE VERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
    java.util.logging.Logger.getLogger(LudecaLogInServ er.class.getName()).log(java.util.logging.Level.SE VERE, null, ex);
    }

    frmLudecaLoginServer = new JFrame();
    frmLudecaLoginServer.setTitle("Ludeca Log-In Server");
    frmLudecaLoginServer.setResizable(false);
    frmLudecaLoginServer.setBounds(100, 100, 580, 601);
    frmLudecaLoginServer.setDefaultCloseOperation(JFra me.EXIT_ON_CLOSE);
    frmLudecaLoginServer.getContentPane().setLayout(nu ll);

    JScrollPane scrollPane = new JScrollPane();
    scrollPane.setBounds(10, 63, 554, 361);
    frmLudecaLoginServer.getContentPane().add(scrollPa ne);



    table.setCellSelectionEnabled(true);
    scrollPane.setViewportView(table);


    table.setModel(modelloTabella);
    table.getColumnModel().getColumn(0).setPreferredWi dth(170);
    table.getColumnModel().getColumn(1).setPreferredWi dth(200);
    table.getColumnModel().getColumn(2).setPreferredWi dth(64);
    table.getColumnModel().getColumn(3).setPreferredWi dth(43);
    table.getColumnModel().getColumn(4).setPreferredWi dth(61);



    panel_1 = new JPanel();
    panel_1.setBounds(0, 532, 574, 34);
    frmLudecaLoginServer.getContentPane().add(panel_1) ;
    panel_1.setLayout(null);

    JButton btnNewButton = new JButton("AGGIORNA SCHERMO");
    btnNewButton.setBounds(10, 11, 139, 23);
    panel_1.add(btnNewButton);

    JButton btnNewButton_1 = new JButton("CREA LOG-IN");
    btnNewButton_1.setBounds(440, 11, 124, 23);
    panel_1.add(btnNewButton_1);

    JButton btnNewButton_2 = new JButton("SALVA FILE");
    btnNewButton_2.setBounds(245, 11, 89, 23);
    panel_1.add(btnNewButton_2);

    JPanel panel = new JPanel();
    panel.setBounds(0, 0, 564, 52);
    frmLudecaLoginServer.getContentPane().add(panel);
    panel.setLayout(null);

    JLabel lblNewLabel = new JLabel("Ludeca Log-In Server");
    lblNewLabel.setForeground(Color.BLUE);
    lblNewLabel.setFont(new Font("SansSerif", Font.BOLD, 30));
    lblNewLabel.setHorizontalAlignment(SwingConstants. CENTER);
    lblNewLabel.setBounds(0, 0, 574, 52);
    panel.add(lblNewLabel);

    JScrollPane scrollPane_1 = new JScrollPane();
    scrollPane_1.setBounds(10, 431, 554, 101);
    frmLudecaLoginServer.getContentPane().add(scrollPa ne_1);


    schermoLog.setText("");
    scrollPane_1.setViewportView(schermoLog);
    }

    public static void accettaConnessioneClient(){
    String esitoAccettazioneClient = new String();
    esitoAccettazioneClient=null;

    try
    {
    clientSocket = serverSocket.accept();
    //serverSocket.setReuseAddress(true);
    in= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    //Stream di output
    out=new DataOutputStream(clientSocket.getOutputStream());
    String loginOperatore = new String();
    loginOperatore=in.readLine().toUpperCase();

    Cell cellaStringaLogIn;
    String stringaEstrattaDaCella = "";
    LabelCell labelCellLogIn;

    //Apro il file di excel da leggere
    Workbook workbook = Workbook.getWorkbook(new File("C:\\Documents and Settings\\Operatore\\Desktop\\listalogin.xls"));
    //Seleziono il foglio sul quale voglio operare (il primo foglio ha indice 0)
    Sheet sheet = workbook.getSheet(0);


    //Leggo tutte le righe
    int riga = 1;//indice riga, parto da 1 per saltare l'intestazione dei campi
    int numeroRighe = sheet.getRows();//calcolo quante righe ci sono nel foglio
    System.out.println(numeroRighe);
    //Attento che c'è una riga in più per l'intestazione!
    while(riga<numeroRighe)
    {

    cellaStringaLogIn = sheet.getCell(0, riga);
    labelCellLogIn = (LabelCell)cellaStringaLogIn;
    stringaEstrattaDaCella = labelCellLogIn.getString();

    System.out.println("Riga:" + riga + "nome:" + stringaEstrattaDaCella +"LOGIN="+loginOperatore);

    // Ora costruisco lo StringTokenizer; separatori: virgola e spazio
    StringTokenizer tokenizer = new StringTokenizer(loginOperatore.toString(), ".");

    // Ottengo tutte le parole
    String [] datiLogin = new String[tokenizer.countTokens()];
    int j = 0;

    while (tokenizer.hasMoreTokens())
    {
    datiLogin[j] = tokenizer.nextToken();
    System.out.println("dati token "+j+" = "+datiLogin[j]);
    j++;
    }



    if(stringaEstrattaDaCella.equals(datiLogin[0]+"."+datiLogin[1]+"."))
    {
    esitoAccettazioneClient="OK";
    Tempo tempo = new Tempo();
    //final Date dataCompleta = tempo.dataCompleta;
    String dataEora= new String();
    dataEora = Integer.toString(tempo.giorno)+"/"+tempo.mese+"/"+Integer.toString(tempo.anno)+" - "+Integer.toString(tempo.ore)+"."+Integer.toString (tempo.minuti)+"."+Integer.toString(tempo.secondi) ;
    Operatore op = new Operatore(datiLogin[0], datiLogin[2],dataEora);
    op.setDataLogIn(dataEora);
    table.setValueAt(op.getUsername(),0,0);
    table.setValueAt(op.getDataLogIn(),0,1);
    table.setValueAt(op.getTelefono(),0,2);
    table.setValueAt(op.getPausa(),0,3);
    table.setValueAt(op.getContatorePause(),0,4);
    //schermoLog.setText("L'Operatore: "+op.getUsername()+" si è connesso alla Postazione "+op.getTelefono()+" in Data "+dataEora);
    schermoLog.insert("[Accesso Log-In]: [Operatore: "+op.getUsername()+" Postazione: "+op.getTelefono()+" Data: " +dataEora+"]\n" , schermoLog.getColumns()); //RIVEDI COLONNE

    System.out.println("UTENTE CORRISPONDE!! "+riga+" op= "+op.getUsername()+" login= "+loginOperatore);

    break;
    }
    else
    {
    esitoAccettazioneClient="DATI_ERRATI";
    Tempo tempo = new Tempo();
    //final Date dataCompleta = tempo.dataCompleta;
    String dataEora= new String();
    dataEora = Integer.toString(tempo.giorno)+"/"+Integer.toString(tempo.mese)+"/"+Integer.toString(tempo.mese)+"/"+Integer.toString(tempo.anno)+" - "+Integer.toString(tempo.ore)+"."+Integer.toString (tempo.minuti)+"."+Integer.toString(tempo.secondi) ;
    //schermoLog.setText("Fallito un Log-In! [Postazione: "+datiLogin[2]+" Data: " +dataEora+"] ...Conosci "+datiLogin[0]+"?" );
    schermoLog.insert("[Negato Log-In]: [Postazione: "+datiLogin[2]+" Data: " +dataEora+"] ...Conosci "+datiLogin[0]+"?" , schermoLog.getColumns());
    System.out.println("UTENTE NON CORRISPONDE");
    }
    riga++;
    }
    out.writeBytes(esitoAccettazioneClient);

    }
    catch (IOException e)
    {
    System.out.println(e);
    System.out.println("Errore di Accettare il Client: Errore di Accettazione o Comunicazione");
    }
    catch (UnknownError e)
    {
    System.out.println(e);
    System.out.println("Errore di Accettare il Client: ERRORE SCONOSCIUTO");
    }
    catch (BiffException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

  3. #3

    SERVER MONOTHREAD FUNZIONANTE (PARTE CONTINUANTE DEL CODICE)

    public static void attivaConnessioneServer()
    {
    try
    {
    serverSocket = new ServerSocket(9911);
    System.out.println("Server: Sono attivo sulla Rete ");
    }
    catch (IOException e)
    {
    System.out.println(e);
    System.out.println("Errore di Connessione Server: Cambiare Porta");
    }
    catch (UnknownError e)
    {
    System.out.println(e);
    System.out.println("Errore di Connessione Server: ERRORE SCONOSCIUTO!!!");
    }
    }

    public static void disconnettiServer()
    {
    try
    {
    in.close();
    out.close();
    clientSocket.close();
    }
    catch (IOException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

  4. #4

    SERVER MULTITHREAD (PRIMA CLASSE)

    codice:
    import java.awt.EventQueue;
    
    import javax.swing.JFrame;
    
    import javax.swing.JPanel;
    
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JButton;
    import javax.swing.JLabel;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    import java.util.GregorianCalendar;
    import java.util.StringTokenizer;
    
    import jxl.Cell;
    import jxl.LabelCell;
    import jxl.Sheet;
    import jxl.Workbook;
    import jxl.read.biff.BiffException;
    import javax.swing.SwingConstants;
    import java.awt.Font;
    import java.awt.Color;
    
    
    public class LudecaLogInServer implements Runnable{
    
    	private JFrame frmLudecaLoginServer;
    	private static JTable table = new JTable();
    	private JPanel panel_1;
    	
    	static JTextArea schermoLog = new JTextArea();
    
       static BufferedReader in ;
        static DataOutputStream  out;
    
        static ServerSocket serverSocket = null;
        static Socket clientSocket = null;
        
      static  String[] nomiColonne = new String[] {"OPERATORE", "DATA LOG-IN", 
                "TELEFONO", "PAUSA", "N\u00B0 PAUSE"};
    
    static String[][] valoriCelle = new String[50][4]; 
    static DefaultTableModel modelloTabella=null;
    	/**
    	 * Launch the application.
    	 */ 
    
    
    	/**
    	 * Create the application.
    	 */
    	public LudecaLogInServer(final Socket clientSocket) {
    		initialize();
    		//this.clientSocket=clientSocket;
    
    		
    	}
    
    	/**
    	 * Initialize the contents of the frame.
    	 */
    	@SuppressWarnings("unused")
    	private void initialize() {
    		/* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tu...feel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException ex) {
                java.util.logging.Logger.getLogger(LudecaLogInServer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                java.util.logging.Logger.getLogger(LudecaLogInServer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                java.util.logging.Logger.getLogger(LudecaLogInServer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            } catch (javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(LudecaLogInServer.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
            
    		frmLudecaLoginServer = new JFrame();
    		frmLudecaLoginServer.setTitle("Ludeca Log-In Server");
    		frmLudecaLoginServer.setResizable(false);
    		frmLudecaLoginServer.setBounds(100, 100, 580, 601);
    		frmLudecaLoginServer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frmLudecaLoginServer.getContentPane().setLayout(null);
    		
    		JScrollPane scrollPane = new JScrollPane();
    		scrollPane.setBounds(10, 63, 554, 361);
    		frmLudecaLoginServer.getContentPane().add(scrollPane);
    
    		
    		for(String[] riga:valoriCelle)
    		{
    			for(String cella:riga)
    			{
    							cella="null";
    			}
    		}
    		modelloTabella = new DefaultTableModel(valoriCelle, nomiColonne);
    		table.setCellSelectionEnabled(true);
    		scrollPane.setViewportView(table);
    		
    				
    		table.setModel(modelloTabella);
    		table.getColumnModel().getColumn(0).setPreferredWidth(170);
    		table.getColumnModel().getColumn(1).setPreferredWidth(200);
    		table.getColumnModel().getColumn(2).setPreferredWidth(64);
    		table.getColumnModel().getColumn(3).setPreferredWidth(43);
    		table.getColumnModel().getColumn(4).setPreferredWidth(61);
    		
    		
    
    		panel_1 = new JPanel();
    		panel_1.setBounds(0, 532, 574, 34);
    		frmLudecaLoginServer.getContentPane().add(panel_1);
    		panel_1.setLayout(null);
    		
    		JButton btnNewButton = new JButton("AGGIORNA SCHERMO");
    		btnNewButton.setBounds(10, 11, 139, 23);
    		panel_1.add(btnNewButton);
    		
    		JButton btnNewButton_1 = new JButton("CREA LOG-IN");
    		btnNewButton_1.setBounds(440, 11, 124, 23);
    		panel_1.add(btnNewButton_1);
    		
    		JButton btnNewButton_2 = new JButton("SALVA FILE");
    		btnNewButton_2.setBounds(245, 11, 89, 23);
    		panel_1.add(btnNewButton_2);
    		
    		JPanel panel = new JPanel();
    		panel.setBounds(0, 0, 564, 52);
    		frmLudecaLoginServer.getContentPane().add(panel);
    		panel.setLayout(null);
    		
    		JLabel lblNewLabel = new JLabel("Ludeca Log-In Server");
    		lblNewLabel.setForeground(Color.BLUE);
    		lblNewLabel.setFont(new Font("SansSerif", Font.BOLD, 30));
    		lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
    		lblNewLabel.setBounds(0, 0, 574, 52);
    		panel.add(lblNewLabel);
    		
    		JScrollPane scrollPane_1 = new JScrollPane();
    		scrollPane_1.setBounds(10, 431, 554, 101);
    		frmLudecaLoginServer.getContentPane().add(scrollPane_1);
    		
    		
    		schermoLog.setText("");
    		scrollPane_1.setViewportView(schermoLog);
    	}
    	
    
    	@Override
    	public void run() {
    		
    		String esitoAccettazioneClient = new String();
        	esitoAccettazioneClient=null;
        	
        	try
        	{
        	    
        	    //serverSocket.setReuseAddress(true);
        	     in= new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        	    //Stream di output
        	     out=new DataOutputStream(clientSocket.getOutputStream());
        	     
                 while(true) 
                 {
                	 String loginOperatore = new String();
             	    loginOperatore=in.readLine().toUpperCase();
                     if (loginOperatore == null || loginOperatore.equals("QUIT"))
                     {
                       break;
                     }
                     
                           
                     //out.writeBytes(loginOperatore + '\n');              
               
                     System.out.println("Il Client ha scritto: " + loginOperatore);
             	    Cell cellaStringaLogIn;
        	        String stringaEstrattaDaCella = "";    
        	        LabelCell labelCellLogIn;
        	        
        	      //Apro il file di excel da leggere
                    Workbook workbook = Workbook.getWorkbook(new File("C:\\Users\\tl2cwdr6hyyq2rvm6tv2\\Desktop\\listalogin.xls"));
                    //Seleziono il foglio sul quale voglio operare (il primo foglio ha indice 0)
                    Sheet sheet = workbook.getSheet(0);
                     
    
                    //Leggo tutte le righe
                    int riga = 1;//indice riga, parto da 1 per saltare l'intestazione dei campi
                    int numeroRighe = sheet.getRows();//calcolo quante righe ci sono nel foglio
                    
                    //Attento che c'è una riga in più per l'intestazione!
                    while(riga<numeroRighe)
                    {
                    
                        cellaStringaLogIn = sheet.getCell(0, riga);
                        labelCellLogIn = (LabelCell)cellaStringaLogIn;
                        stringaEstrattaDaCella = labelCellLogIn.getString();
                        
                        System.out.println("Riga:" + riga + "nome:" + stringaEstrattaDaCella +"LOGIN="+loginOperatore);
                
                     // Ora costruisco lo StringTokenizer; separatori: virgola e spazio
        				StringTokenizer tokenizer = new StringTokenizer(loginOperatore.toString(), ".");
    
        				// Ottengo tutte le parole
        				String [] datiLogin = new String[tokenizer.countTokens()];
        				int j = 0;
        				
        				while (tokenizer.hasMoreTokens()) 
        				{
        				   datiLogin[j] = tokenizer.nextToken();
        				   System.out.println("dati token "+j+" = "+datiLogin[j]);
        				   j++;
        				}
        				
        				 
        				
            	    if(stringaEstrattaDaCella.equals(datiLogin[0]+"."+datiLogin[1]+"."))
            	    {
            	    	esitoAccettazioneClient="OK";
            	    	Tempo tempo = new Tempo();
        		        //final Date dataCompleta = tempo.dataCompleta;
        		        String dataEora= new String();
        		        dataEora = Integer.toString(tempo.giorno)+"/"+tempo.mese+"/"+Integer.toString(tempo.anno)+" - "+Integer.toString(tempo.ore)+"."+Integer.toString(tempo.minuti)+"."+Integer.toString(tempo.secondi); 
        		     	Operatore op = new Operatore(datiLogin[0], datiLogin[2],dataEora);
        				op.setDataLogIn(dataEora);
        				table.setValueAt(op.getUsername(),0,0);
        				table.setValueAt(op.getDataLogIn(),0,1);
        				table.setValueAt(op.getTelefono(),0,2);
        				table.setValueAt(op.getPausa(),0,3);
        				table.setValueAt(op.getContatorePause(),0,4);
        				//schermoLog.setText("L'Operatore: "+op.getUsername()+" si è connesso alla Postazione "+op.getTelefono()+" in Data "+dataEora);
        				schermoLog.insert("[Accesso Log-In]: [Operatore: "+op.getUsername()+" Postazione: "+op.getTelefono()+"  Data: " +dataEora+"]\n" , schermoLog.getColumns()); //RIVEDI COLONNE
        				
        				System.out.println("UTENTE CORRISPONDE!! "+riga+" op= "+op.getUsername()+" login= "+loginOperatore);
        		      				
        				break;
            	    }
            	    else
            	    {
            	    	esitoAccettazioneClient="DATI_ERRATI";
            	    	Tempo tempo = new Tempo();
        		        //final Date dataCompleta = tempo.dataCompleta;
        		        String dataEora= new String();
        		        dataEora = Integer.toString(tempo.giorno)+"/"+Integer.toString(tempo.mese)+"/"+Integer.toString(tempo.mese)+"/"+Integer.toString(tempo.anno)+" - "+Integer.toString(tempo.ore)+"."+Integer.toString(tempo.minuti)+"."+Integer.toString(tempo.secondi); 
            	    	//schermoLog.setText("Fallito un Log-In! [Postazione: "+datiLogin[2]+"  Data: " +dataEora+"] ...Conosci "+datiLogin[0]+"?" );
            	    	schermoLog.insert("[Negato Log-In]: [Postazione: "+datiLogin[2]+"  Data: " +dataEora+"] ...Conosci "+datiLogin[0]+"?" , schermoLog.getColumns());
            	    	System.out.println("UTENTE NON CORRISPONDE");
            	    }
            	    riga++;
            	    }
            	    out.writeBytes(esitoAccettazioneClient);
            	    out.flush();
                 }
                
                 out.close();
                 in.close();
                 System.out.println("Ho ricevuto una chiamata di chiusura da:\n"
     			 + clientSocket + "\n");
                 clientSocket.close();
      
        	   }    
        	   catch (IOException e) 
           	   {
           	     System.out.println(e);
           	     System.out.println("Errore di Accettare il Client: Errore di Accettazione o Comunicazione");
           	   }
        	   catch (UnknownError e)
        	   {
           	    System.out.println(e);
           	    System.out.println("Errore di Accettare il Client: ERRORE SCONOSCIUTO");
        	   } 
        	   catch (BiffException e) 
        	   {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		
    		
    	}
    }

  5. #5

    SERVER MULTITHREAD (SECONDA CLASSE)

    import java.net.ServerSocket;
    import java.net.Socket;


    public class LudecaLogInServerParallelMain
    {
    public void start() throws Exception {
    @SuppressWarnings("resource")
    ServerSocket serverSocket = new ServerSocket(9911);

    //Ciclo infinito di ascolto dei Client
    while(true) {
    System.out.println("In attesa di chiamate dai Client... ");
    Socket socket = serverSocket.accept();
    System.out.println("Ho ricevuto una chiamata di apertura da:\n" +
    socket);
    LudecaLogInServer serverThread = new LudecaLogInServer(socket);
    serverThread.run();
    }
    }

    public static void main (String[] args) throws Exception {
    LudecaLogInServerParallelMain serverSempreInAscolto = new LudecaLogInServerParallelMain();
    serverSempreInAscolto.start();
    }
    }

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ciao,
    Premetto che di java ne capisco poco, comunque credo che dovresti separare la parte della GUI dalla logica che sta dietro alla comunicazione client-server.
    Se LudecaLogInServer(socket); crea anche il JPanel mi pare ovvio che questo viene creato di continuo ad ogni nuovo thread

    Schematicamente dovrebbe essere (prendilo per pseudocodice ):
    codice:
     class LudecaGUIServer();               //Runnable, gestisce solo la gui
     class LudecaThreadServer(socket);  //Runnable, gestisce la comunicazione con il client
    
    
      class LudecaLogInServerParallelMain() {
       
       public void main(){
           LudecaGUIServer gui = LudecaGUIServer();
           gui.run();
       
          while(true) {
              System.out.println("In attesa di chiamate dai Client... ");
              Socket socket = serverSocket.accept();
              System.out.println("Ho ricevuto una chiamata di apertura da:\n" +
              socket);
              LudecaThreadServer serverThread = new LudecaThreadServer(socket);
              serverThread.run();
          }
        }
      }
    Chiaramente, lascio a te l'onere di gestire i thread e la loro comunicazione oltre alle risorse condivise (probabilmente i thread lavoreranno sulla stessa JTable)

  7. #7

    grazie

    GRAZIE MILLE!!!
    Il tuo consiglio mi è stato utile ad eliminare l'errore sulla creazione del buffer e il loop infinito.
    adesso ho un altro problema: alcune comunicazioni vengono effettuate mentre le ultime no.
    la login viene inviata, il server la riceve, quest'ultimo apre correttamente il file excel e confronta la login la riconosce però non riesco a capire perchè non riesce a inviare l'ok al client, quindi il cronometro non scatta e sulla jtable del server non viene indicata la presenza della nuova connessione, non si aggiorna in pratica. puoi aiutarmi tu se ti posto il codice? purtroppo quando posto qualcosa io poche anime pie rispondono. grazie infinite per il tuo aiuto amico :-)gr

  8. #8
    Posta il codice si, così si guarda.

  9. #9
    ragazzi prendete per riferimento il codice che vi ho gia postato, perchè sto creando un macello per fare queste modifiche e il programma non funziona. vi è utile il codice che ho postato o vi serve quello in versione monothread? che quest'ultimo sicuro funziona

  10. #10
    Prova a creare due thread in background che sono adibiti uno all'ascolto uno alla comunicazione col client.

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.