Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Java Client/Server come passare un Oggetto?

    Per un progetto a scuola sto creando una applicazione client server che gestisce un negozio di arredamento, ora tramite il server devo gestire il database per questo devo riuscire a trasmettere dal server i risultati delle query (Result Set) al Client , ho provato ad utilizzare ObjectInputStream ma non riesco a farlo funzionare , non capisco perchè, ci sono alternative per fare questa operazione oppure sapete dirmi bene come devo utilizzarlo? grazie in anticipo!
    allego il codice!


    public class Client implements Serializable{
    public Socket MyClient;
    public PrintStream output;
    public DataInputStream inputLine;
    public ObjectInputStream input;

    InetAddress host;


    public Client() throws UnknownHostException, IOException
    {
    host = InetAddress.getLocalHost();
    Socket MyClient=new Socket(host,2996);
    output = new PrintStream(MyClient.getOutputStream());
    //input=new ObjectInputStream(MyClient.getInputStream());
    }

    public static void close(PrintStream output, ObjectInputStream input, Socket MyClient) throws IOException
    {

    output.close();
    input.close();
    MyClient.close();

    }

    public ResultSet comando(String com) throws IOException
    {
    ResultSet responseLine = null;

    try {
    output.flush();
    output.println(com);
    input=new ObjectInputStream(MyClient.getInputStream());
    responseLine = (ResultSet) input.readObject();
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(Client.class.getName()).log(Level .SEVERE, null, ex);
    }
    return responseLine;
    }
    }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Cosa vuol dire "non riesco a farlo funzionare"?
    Non compila? Non esegue? Eccezioni?
    Cosa non capisci?

    Consiglio generale: la flush() va fatta DOPO aver scritto qualcosa ^^

    E se devi inviare/ricevere solo stringhe, c'è un esempio ufficiale sul sito Oracle: http://docs.oracle.com/javase/tutori...ngWriting.html

    ps: Il codice si posta col tag CODE o diventa illeggibile.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    scusa ma è la prima volta che scrivo sul sito!
    comunque non devo inviare solo stringhe devo far passare un resultSet , l'errore si presenta qui
    codice:
     input=new ObjectInputStream(MyClient.getInputStream());
    se faccio il debug mi entra in un ciclo infinito altrimenti mi da l'errore Java Null Pointer Exception!

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Guarda bene nel costruttore di Client... Stai dichiarando e creando una nuova Socket col nome MyClient che sovrascrive l'omonima MyClient dichiarata come attributo.

    Dici di passare un ResultSet... ma tu con output.println(com) stai scrivendo una stringa...
    Per spedire un oggetto devi usare ObjectOutputStream (e lo ricevi con ObjectInputStream)


    Altre cosette:

    1. Le convenzioni: i nomi degli oggetti (così come i metodi) iniziano con la minuscola. Quindi myClient e non MyClient.
    2. Gli attributi vanno messi private e non public. Se sono necessari anche all'esterno della classe devi fornire gli appositi getter.
    3. Metodo close() static: perché? La classe Client ha già i riferimenti a quegli oggetti, chiudi direttamente quelli no? E fai un null-check altrimenti potrebbe scoppiare tutto
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Guarda bene nel costruttore di Client... Stai dichiarando e creando una nuova Socket col nome MyClient che sovrascrive l'omonima MyClient dichiarata come attributo.

    Dici di passare un ResultSet... ma tu con output.println(com) stai scrivendo una stringa...
    Per spedire un oggetto devi usare ObjectOutputStream (e lo ricevi con ObjectInputStream)


    Altre cosette:

    1. Le convenzioni: i nomi degli oggetti (così come i metodi) iniziano con la minuscola. Quindi myClient e non MyClient.
    2. Gli attributi vanno messi private e non public. Se sono necessari anche all'esterno della classe devi fornire gli appositi getter.
    3. Metodo close() static: perché? La classe Client ha già i riferimenti a quegli oggetti, chiudi direttamente quelli no? E fai un null-check altrimenti potrebbe scoppiare tutto
    Io da client devo inviare solamente un comando non devo mandare nessun oggetto per questo uso output.println , deve essere il server che invia al client un Result Set
    cmq so che non è molto corretto come codice è che negli ultimi 3 giorni ho provato a modificare di tutto per farlo andare, inoltre siamo in 3 a lavorarci praticamente quindi vedrò di sistemare certe cose dopo, comunque secondo te da cosa è causato l'errore?

  6. #6
    Questa è la parte server!

    codice:
    public class SimpleMaviServer implements Runnable {
    
    
        private ServerSocket server = null;
        private Thread thread = null;
        private MaviServerThread client = null;
        private boolean quit = false;
    
    
        //costruttore che mi legge la porta e mi 
        //crea connessione con il client
        public SimpleMaviServer(int port) {
            try {
                //stampo che sta avvenendo la connessione alla porta
                System.out.println("Binding to port " + port + ", please wait  ...");
                //creo un serversocket
                server = new ServerSocket(port);
                //stampo l'avvio del server
                System.out.println("Server started: " + server);
                //avvio il serversocket
                start();
            } catch (IOException ioe) {
                System.out.println(ioe);
            }
        }
    
    
        public void run() {
           
            //avvio un ciclo che non finisce finchè non viene digitato quit
            while (quit == false) {
                try {
                    System.out.println("Waiting for a client ...");
                    //richiamo il metodo addThread accettando il serversocket
                    addThread(server.accept());
                } catch (IOException ie) {
                    System.out.println("Acceptance Error: " + ie);
                }
            }
            //System.out.println("esco da run");
        }
    
    
        public void addThread(Socket socket) {
            try {
                System.out.println("Client accepted: " + socket);
                
                //creo un oggetto della classe MaviServerThread
                client = new MaviServerThread(this, socket);
                client.open();
                client.start();
            } catch (IOException ex) {
                Logger.getLogger(SimpleMaviServer.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    
        public void start() { /* no change */ }
    
    
        public void stop() { /* no change */ }
    
    
        public static void main(String args[]) {
            
            //creo oggetto della classe SimpleMaviServer
            SimpleMaviServer s = new SimpleMaviServer(2996);
            //richiamo il metodo run della classe SimpleMaviServer
            s.run();
    
    
        }
    }
    codice:
    package Server;
    
    
    import java.net.*;
    import java.io.*;
    import java.util.Scanner;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import server.JavaConnectDb;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.io.Serializable;
    import negozio.Rquery;
    
    
    public class MaviServerThread extends Thread implements Serializable {
    
    
        private Socket socket = null;
        private SimpleMaviServer server = null;
        private int ID = -1;
        // private DataInputStream streamIn = null;
        private Scanner scannerIn;
        private ObjectOutputStream printOut;
        private String received = "";
        private String cod_filiale;
        private static JavaConnectDb jcd = new JavaConnectDb("sweethome","root","kobraman94");
        public MaviServerThread(SimpleMaviServer _server, Socket _socket) {
            server = _server;
            socket = _socket;
            ID = socket.getPort();
        }
    
    
        @Override
        public void run() {
            try {
                System.out.println("Server Thread " + ID + " running.");
                scannerIn = new Scanner(socket.getInputStream());
                printOut = new ObjectOutputStream(socket.getOutputStream());
                boolean connessione = jcd.connetti();
           //gestisco il caso in cui non avvenga la connessione
                if (connessione == false) 
                {
                    System.out.println("ERRORE: errore durante la connessione");
                    System.out.println(jcd.getErrore());
                 } connessione = jcd.connetti();
                while (!received.equals("QUIT")) {
                    received = scannerIn.nextLine();
                    String comando="";
                    String contenuto="";
                    if (received.contains("|"))
                    {
                        String[] parts = received.split("|");
                        comando = received.substring(0, received.indexOf('|'));
                        contenuto = received.substring(received.indexOf('|')+1);
                    }
                     switch(comando)
                    {
                         case "cod_fil": cod_filiale = contenuto;
                                         System.out.println("codice filiale:" + cod_filiale);
                             break;             
                        case "listComm": printOut.writeObject(listComm());
                            break;
                        case "gestMag": printOut.writeObject(gestMag());
                        case "prova":printOut.writeObject(gestMag());
                            break;
                    }
                    
                    
                    System.out.println("client " + ID + " says: " + received);
                    //System.out.println("client " + ID + " command: " + comando);
                    //System.out.println("client " + ID + " content: " + contenuto);
                    
                    
                    //printOut.println("your command: " + comando);
                    //printOut.println("your content: " + contenuto);
                }
                socket.close();
            } catch (IOException ex) {
                Logger.getLogger(MaviServerThread.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
    
         public ResultSet gestMag()
         {
            String sql = "select * from prodotti_filiale where cod_filiale='"+ cod_filiale +"'";
            
            PreparedStatement pst = null;
            ResultSet rs = null;
            
            try
            {
                pst = JavaConnectDb.db.prepareStatement(sql);
                rs = pst.executeQuery();
                
            }
            catch(Exception ex)
            {}
            
            return rs;
        }
         
         public ResultSet listComm()
         {
             String id_tipo = "1";
             String sql = "select * from personale p, filiale f, tipo_personale t where p.cod_filiale=f.cod_filiale and p.id_tipo_personale=t.id_tipo and p.cod_filiale="+ cod_filiale+" and t.id_tipo="+ id_tipo;
             
             PreparedStatement pst = null;
             ResultSet rs = null;
             Rquery res=new Rquery(rs);
             try
             {
                 pst = JavaConnectDb.db.prepareStatement(sql);
                 rs = pst.executeQuery();
             }
             catch(Exception e)
             {}
             
             return rs;
         }
         public ResultSet prova()
         {
             String sql="select * from sweethome.prodotti";
             PreparedStatement pst = null;
             ResultSet rs = null;
               try
             {
                 pst = JavaConnectDb.db.prepareStatement(sql);
                 rs = pst.executeQuery();
             }
             catch(Exception e)
             {}
             return rs;
         }
        
        
        public void open() throws IOException {
    //        streamIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        }
    
    
        public void close() throws IOException {
      /*      if (socket != null) {
                socket.close();
            }
            if (streamIn != null) {
                streamIn.close();
            }
        */
        }
    }
    Sto cercando di far funzionare solo il metodo prova ma con scarsi risultati!

Tag per questa discussione

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.