Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di nicola
    Registrato dal
    May 2007
    Messaggi
    86

    [java]invio oggetti da client a server

    scusate... è possibile inviare un oggetto da un client ad un server....
    uso sempre una socket...
    mi spiego meglio...
    creo un oggetto, lo riempio con boolean stringhe int ecc....
    ora vorrei inviare questo oggetto al server e questt'ultimo legge l'oggetto e si prende i dati che gli servono...
    come si fa ad inviare un oggetto
    io sto facendo così
    codice:
    ObjectOutputStream os; 
    os = null;
    try
    {
    valore = 1;	
    os = new ObjectOutputStream (client.getOutputStream());
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    bw.write(valore);
    bw.flush();
    in questo caso valore è un intero...
    se provo a dichiarare valore come un oggetto mi da errore e mi chiede di convertire valore in intero...
    come faccio ad inviare un oggetto?
    magai mi sto piegando male e mi scuso per questo... ma ancora non ho compreso bene come funziona l'invio da un client e la ricezione da un server....
    vi chiedo di scusarmi in anticipo!!!!
    grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java]invio oggetti da client a server

    Originariamente inviato da nicola
    creo un oggetto, lo riempio con boolean stringhe int ecc....
    Di una "tua" classe?

    Originariamente inviato da nicola
    ora vorrei inviare questo oggetto al server e questt'ultimo legge l'oggetto e si prende i dati che gli servono...
    Ripeto la domanda di prima: l'oggetto è di una classe che hai scritto tu? E la classe è marcata Serializable?


    Originariamente inviato da nicola
    come si fa ad inviare un oggetto
    io sto facendo così
    codice:
    ObjectOutputStream os; 
    os = null;
    try
    {
    valore = 1;	
    os = new ObjectOutputStream (client.getOutputStream());
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
    bw.write(valore);
    bw.flush();
    Così non stai usando la serializzazione e l'uso di ObjectOutputStream è inutile. Con il codice sopra, se 'valore' è un int, stai semplicemente scrivendo 1 carattere che ha il codice Unicode del valore intero.

    Se si vuole usare la "serializzazione":

    codice:
    ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream());
    oos.writeObject (unOggettoSerializzabile);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    Per inviare oggetti io faccio cosi:

    codice:
    byte[] buffer = new byte[500];
    DatagramSocket ds = new DatagramSocket();
    DatagramPacket dp = new DatagramPacket( buffer, buffer.length, ia, port );
    ByteArrayOutputStream baos = new ByteArrayOutputStream()
    ObjectOutputStream output = new ObjectOutputStream( baos );
    
    output.writeObject( myObj );
    
    buffer = baos.toByteArray();
    dp.setData( buffer );
    dp.setLength( buffer.length );
    
    ds.send(dp);
    Per riceverli invece:

    codice:
    byte[] buffer = new byte[500];
    DatagramSocket ds = new DatagramSocket(port);
    DatagramPacket dp = new DatagramPacket( buffer, buffer.length );
    
    ds.receive(dp);
    
    ByteArrayInputStream bais = new ByteArrayInputStream(dp.getData(),0,dp.getLength() );
    ObjectInputStream input = new ObjectInputStream( bais );
    
    MyClassObject obj1 = (MyClassObject) input.readObject();
    Questo se gli oggetti li vuoi inviare con UDP, se invece utilizzi TCP devi prima ottenere lo stream con getInputStream() o l'output e poi gli attacchi il filtro ObjectInputStream , o output

    Di sicuro ci sono modi migliori, ma cosi' va :-)

    EDIT: leggendo la risposta sopra mi ero dimenticato appunto di dirlo, la classe che invii deve implementare Serializable
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Poker1
    Di sicuro ci sono modi migliori, ma cosi' va :-)
    Vedendo il tuo codice sicuramente. La creazione del buffer di 500 byte è inutile, poi la creazione del DatagramPacket si può fare anche dopo. Risultato:

    codice:
    ByteArrayOutputStream baos = new ByteArrayOutputStream ();
    ObjectOutputStream oos = new ObjectOutputStream (baos);
    oos.writeObject (unOggetto);
    
    DatagramPacket dp = new DatagramPacket (baos.toByteArray(), baos.size(), addr, port);
    E comunque questo vale pe UDP, che non riguarda la domanda iniziale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    bhe lui ha detto semplicemente Socket, non ha specificato se UDP o TCP, io ho dato il modo per inviarlo con UDP :-)
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Poker1
    bhe lui ha detto semplicemente Socket, non ha specificato se UDP o TCP
    Sì, ma vedendo il metodo getOutputStream(), dovrebbe subito saltare all'occhio che non è certamente DatagramSocket!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479
    In fondo alla mia risposto ho scritto appunto quello, se vuole utilizzare TCP di ottenere prima lo stream con i metodi get e poi metterci il filtro. Non e' che ero proprio fuori tema :-)
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  8. #8
    Utente di HTML.it L'avatar di nicola
    Registrato dal
    May 2007
    Messaggi
    86
    and io ho cercato di fare così:
    codice:
    public static int aperturaConto(Persona p, float saldo, Data d)
            throws UnknownHostException
        {
            int numeroConto = 0;
            connect();
            try
            {
                richiesta.writeInt(1);
                richiesta.writeBoolean(false);
                richiesta.writeObject(p);
                richiesta.writeFloat(saldo);
                richiesta.writeObject(d);
                richiesta.flush();
                Object obj = risposta.readObject();
                if(obj != null)
                    throw (IllegalArgumentException)obj;
                numeroConto = risposta.readInt();
            }
            catch(IOException e)
            {
                throw new UnknownHostException(); 
            }
            catch(ClassNotFoundException classnotfoundexception) { }
            disconnect();
            return numeroConto;
        }
    richiamo il metodo connect() che fa
    codice:
    private static void connect()
            throws UnknownHostException
        {
            try
            {
                socket = new Socket("127.0.0.1", 7780);
                richiesta = new ObjectOutputStream(socket.getOutputStream());
                risposta = new ObjectInputStream(socket.getInputStream());
            }
            catch(IOException e1)
            {
                throw new UnknownHostException();
            }
        }
    richiesta e risposta sono:

    private static ObjectInputStream risposta;
    private static ObjectOutputStream richiesta;

    mi viene generata questa eccezione nella parte in rosso ...

    java.net.UnknownHostException

    suppongo che significhi che non riconosce il server...
    però in un primo memeno quando faccio la connect, non mi ha errori
    poi mi solleva questa eccezione nel momento dell'invio dei dati...
    sapreste dirmi xkè? e come risolvere?.... grazie

  9. #9
    Utente di HTML.it L'avatar di nicola
    Registrato dal
    May 2007
    Messaggi
    86
    il server si apre una connessione sulla porta 7780
    in questo modo
    codice:
    serverSocket = new ServerSocket(7780);
    			JOptionPane e = new JOptionPane();
    			JFrame newframe = new JFrame();
    			e.showMessageDialog(newframe,"            Avvia il Client");
    			System.out.println("avvia il Client[ArchivioMulti...](159): ");			
    			Socket socket = serverSocket.accept();
    			monitor.append((new StringBuilder("Accettata connessione da[ArchivioMulti...](163): ")).append(socket.getInetAddress()).append(":").append(socket.getPort()).append("\n").toString());
    			System.out.println("\n do questo socket a singleServer[ArchivioMultiServer](174):\n"+socket.getInetAddress()+","+socket.getPort());
    			ArchivioSingleServer serverThread = new ArchivioSingleServer(socket, dbContiCorrente, dataUltimoAggiornamentoCarte);
                serverThread.start();
    quando però stampo la porta del socket che passo ad archivioSingleServer...
    mi viene stampata una porta diversa da 7780, la crea dando 4 numeri in random....
    e naturalmente io dico al client di connettersi alla porta 7780 e mi genera l'eccezione perchè non trova la porta giusta....
    sapreste dirmi perchè cambia il numero della porta? e come risolvere la cosa?

  10. #10
    Utente di HTML.it L'avatar di nicola
    Registrato dal
    May 2007
    Messaggi
    86
    quando stampo il socket dal server mi viene fuori

    INDIRIZZO: /127.0.0.1
    PORTA: 1855
    LOCALPORT: 7780

    quando invece lo stampo dal client...

    INDIRIZZO: localhost/127.0.0.1
    PORTA: 7780
    LOCALPORT: 1855

    sapreste dirmi perchè inverte?

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.