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

    Problema scambio oggetti tra client e server

    Salve a tutti!
    Devo far scambiare oggetti tra un client e un server ma non mi funziona e non riesco a capire perchè. quando li avvio, non mi danno errori, nè eccezioni; la connessione si instaura ma non avviene lo scambio di messaggi quindi sia l'uno che l'altro restano in un'attesa infinita. GRAZIE A QUANTI MI AIUTERANNO!

    L'oggetto che si dovrebbero scambiare è di tipo Message:

    codice:
    package clientserver;
    
    import java.io.Serializable;
    /**
     *
     * @author Rosa Linda
     */
    public class Message implements Serializable{
        private String mittente;
        private String ricevente;
        private int porta;
    
        Message(String mittente, String ricevente, int porta){
            this.mittente=mittente;
            this.ricevente=ricevente;
            this.porta=porta;
        }
    
        public String getMittente(){
            return this.mittente;
        }
    
        public String getRicevente(){
            return this.ricevente;
        }
    
        public int getPorta(){
            return this.porta;
        }
    
    }
    Ecco il codice di server e client:
    codice:
    import java.io.*;
    import java.net.*;
    import java.util.*;
    
    /**
     *
     * @author Rosa Linda
     */
    public class Server extends Thread{
        private ServerSocket Server;
    
        public static void main(String[] args) throws Exception{
            new Server();
        }
    
        public Server() throws Exception{
            this.Server=new ServerSocket(4000);
            System.out.println("Il server è in ascolto sulla porta 4000");
            this.start();
        }
    
        @Override
        public void run(){
            while(true){
                try{
                    System.out.println("In attesa di connesione");
                    Socket client=Server.accept();
                    System.out.println("Connessione accettata da "+client.getInetAddress());
                    Connect c=new Connect(client);
                }catch(Exception e){
    
                }
            }
        }
    
    }
    
    class Connect extends Thread implements Serializable{
        private Socket client=null;
        ObjectOutputStream oos=null;
        ObjectInputStream ois=null;
    
        public Connect(){
    
        }
    
        public Connect(Socket clientSocket){
            this.client=clientSocket;
            
            try{
    //IL PROBLEMA E' QUI SECONDO ME
                ois=new ObjectInputStream(client.getInputStream());     
                oos=new ObjectOutputStream(client.getOutputStream());
                
            }catch(Exception e){
                try{
                    System.out.println("Il client si è disconnesso");
                    client.close();
                }catch(Exception ee){
                    System.out.println(ee.getMessage());
                }
                return;
            }
            this.start();
        }
        
        @Override
        public void run(){
            try{
                Message message=new Message("Server","Client",4000);           
               
                oos.writeObject(message);
                
                oos.flush();
                oos.close();
                ois.close();
                client.close();
            }catch(Exception e){
                System.out.println(e.getMessage());
            }
        }
    }
    codice:
    import java.io.*;
    import java.net.*;
    
    /**
     *
     * @author Rosa Linda
     */
    public class Client implements Serializable{
        public static void main(String[] args){
            ObjectOutputStream oos=null;
            ObjectInputStream ois=null;
            Socket socket=null;
            Message message;
    
                try{
                    socket=new Socket("localhost",4000);
                    ois=new ObjectInputStream(socket.getInputStream());
                    oos=new ObjectOutputStream(socket.getOutputStream());
                    message=(Message)ois.readObject();
                    System.out.println("Messaggio ricevuto da: "+message.getMittente()+" per "+message.getRicevente()+"\nConnessione avvenuta sulla porta "+message.getPorta());
                    oos.close();
                    ois.close();
                }catch(Exception e){
                    System.out.println(e.getMessage());
                }
        }
    }

  2. #2

    Re: Problema scambio oggetti tra client e server

    Originariamente inviato da Linda2801
    //IL PROBLEMA E' QUI SECONDO ME
    ois=new ObjectInputStream(client.getInputStream());
    oos=new ObjectOutputStream(client.getOutputStream());
    Istanzia prima l'ObjectOutputStream, altrimenti si ferma lì.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Quando si posta del codice si devono usare i tag CODE, come espressamente indicato nel Regolamento interno.

    Ho corretto io.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Grazie x la correzione "sintattica", si vede proprio che sono nuova
    L'istanziazione l'ho fatta sopra e anche a farla al volo non funziona...

  5. #5
    Originariamente inviato da Linda2801
    L'istanziazione l'ho fatta sopra e anche a farla al volo non funziona...
    Dipende da cosa intendi col dire "non funziona"..

  6. #6
    Ok avevo interpretato male la correzione, perfetto prima istanzio output e poi input... non sapevo fosse importante l'ordine =)
    grazie milleeeeeeeeeeee

  7. #7
    Ho di nuovo lo stesso problema anche se in un programma differente... questa volta è il client che deve mandare un messaggio di richiesta al server, quindi sul canovaccio precedente ho apportato delle modifiche. il metodo run del server è il seguente:
    codice:
     @Override
            public void run(){
                try{
                    Message messageRich, messageRisp;       //la richiesta è del punto di accesso, la risposta è del sistema centrale
    
                    messageRich=(Message)ois.readObject();
    
                    if(messageRich.getTipo()==1){
                        float disp=verificaAbbonamento(messageRich.getTarga());
                        messageRisp=new Message(messageRich.getTarga(),disp);
                        oos.writeObject(messageRisp);
                    }
                    if(messageRich.getTipo()==2){
                        boolean effettuato=effettuaPagamento(messageRich.getTarga(),messageRich.getCifra());
                        oos.writeBoolean(effettuato);
                    }
                    if(messageRich.getTipo()==0){
                        boolean effettuata=effettuaRicarica(messageRich.getTarga(),messageRich.getCifra());
                        oos.writeBoolean(effettuata);
                    }
    
                    oos.close();
                    ois.close();
                    client.close();
                }catch(Exception e){
                }
            }
    Il metodo del client che invia la richiesta è il seguente:
    codice:
    public float verificaAbbonamento(String targa) {
                ObjectOutputStream oos=null;
                ObjectInputStream ois=null;
                Socket socket=null;
                float cifra=-1;
                Message messageRich,messageRisp;        //la richiesta è del punto d'accesso, la risposta è del sistema centrale
    
                    try{
                        socket=new Socket("localhost",4000);        //Si connette al sistema centrale
                        
                        oos=new ObjectOutputStream(socket.getOutputStream());
                        ois=new ObjectInputStream(socket.getInputStream());
                       
                        messageRich=new Message(targa);
                        
                        oos.writeObject(messageRich);
                        oos.flush();
                        messageRisp=(Message)ois.readObject();
                        cifra=messageRisp.getCifra();
    
                        oos.close();
                        ois.close();
    
                    }catch(Exception e){
                        System.out.println(e.getMessage());
                    }
    
                return cifra;
            }
    Entrambi sono gestiti da interfaccia grafica.
    Dove sbaglio??
    Grazie per l'aiuto

  8. #8
    Originariamente inviato da Linda2801
    Ho di nuovo lo stesso problema anche se in un programma differente...
    Cioè? Riscontri un'eccezione oppure cosa?

  9. #9
    il server stampa null mentre il client resta bloccato in un'attesa infinita (il pulsante resta bloccato)

  10. #10
    Originariamente inviato da Linda2801
    il server stampa null mentre il client resta bloccato in un'attesa infinita (il pulsante resta bloccato)
    Resta bloccato in quanto evidentemente dipende direttamente dall'operazione che deve essere eseguita al momento della sua pressione (e questa causerebbe il blocco), quindi sarebbe meglio distaccare le due cose.

    Poi perchè in verificaAbbonamento riesegui la connessione al server, quando puoi utilizzare una sola connessione?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.