Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    15

    [JAVA] DataInput/OutputStream nei Socket

    Salve a tutti, sono abbastanza disperato perchè non trovo una soluzione e quindi andrò subito al dunque.. Sto facendo un piccolo giochino ma all'inizio c'è un menù di scelta dei personaggi. Qui avviene la connessione client/server e ogni volta che cambio personaggio nel client ad esempio spedisco un numero al server che mi disegnerà nella schermata del server il personaggio scelto dall'avversario e vice versa. Spedendo i dati dal KeyPressed (cioè ogni volta che si cambia un personaggio) il gioco si blocca un paio di secondi e poi spedisce i numeri, e non è esattamente quello che voglio dato che deve essere una cosa fluida spedire un intero.. -.-
    Vi aggiungo il codice incriminato in caso vi sia utile..

    CLASSE ChooseCharacter LATO SERVER (identica nel lato client)
    codice:
    public class ChooseCharacter extends Canvas implements MouseListener, KeyListener
    {
        JFrame f;
        Image sfondo;
        Image[] p = new Image[4];
        ClientConnection c = new ClientConnection();
        int i, a;
    
        public ChooseCharacter(JFrame frame) 
        {
            f = frame;
            this.addMouseListener(this);
            this.addKeyListener(this);
            f.setTitle("Scelta Personaggio");
            sfondo = Toolkit.getDefaultToolkit().getImage("sceltaPersonaggio.jpg");
            sfondo = sfondo.getScaledInstance(f.getWidth(), f.getHeight(), Image.SCALE_DEFAULT);
            p[0] = Toolkit.getDefaultToolkit().getImage("p0.jpg");
            p[1] = Toolkit.getDefaultToolkit().getImage("p1.jpg");
            p[2] = Toolkit.getDefaultToolkit().getImage("p2.jpg");
            p[3] = Toolkit.getDefaultToolkit().getImage("p3.jpg");
            c.attendiClient();
            i = 0;
        }
    
        @Override
        public void paint(Graphics g)
        {
            g = (Graphics2D) g;
            g.drawImage(sfondo, -5, -35, this);
            g.drawImage(p[i], 50, 50, this);
            g.drawImage(p[a], 200, 50, this);
        }
    
        public void keyPressed(KeyEvent e)
        {
                if(e.getKeyCode() == KeyEvent.VK_UP)
                   if(i == 3)
                       i=0;
                   else
                       i++;
                if(e.getKeyCode() == KeyEvent.VK_DOWN)
                    if (i==0)
                        i=3;
                    else
                        i--;
    
            c.inviaDati(i);
            a = c.riceviDati();
            repaint();
        }
    }
    CLASSE ClientConnection (dal server mi connetto al client)
    codice:
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ClientConnection
    {
        ServerSocket server = null;
        Socket client = null;
        DataInputStream dis = null;
        DataOutputStream dos = null;
    
        public ClientConnection()
        {
        }
    
        public Socket attendiClient()
        {
            try
            {
                server = new ServerSocket(5000);
                client = server.accept();
                server.close();
                
                dis = new DataInputStream(new DataInputStream(client.getInputStream()));
                dos=new DataOutputStream(client.getOutputStream());
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
                System.out.println("Errore durante la connessione");
                System.exit(1);
            }
    
            return client;
        }
    
        public int riceviDati()
        {
            try {
                System.out.print("" + dis.readInt()+'\n');
                return dis.readInt();
            } catch (IOException ex) {
    
            }
            System.out.print("Non sono dentro il try"+'\n');
            return 0;
        }
    
        public void inviaDati(int val)
        {
            try
            {
                dos.writeInt(val);
            }
            catch(IOException e){}
        }
    }
    CLASSE ServerConnection (lato client per la connessione verso il server)
    codice:
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.net.Socket;
    
    public class ServerConnection
    {
        Socket client = null;
        DataInputStream dis = null;
        DataOutputStream dos = null;
    
        public ServerConnection()
        {
        }
    
        public void connetti()
        {
            try
            {
                client = new Socket("192.168.1.100", 5000);
                dis = new DataInputStream(client.getInputStream());
                dos = new DataOutputStream(client.getOutputStream());
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    
        public int riceviDati()
        {
            try {
                System.out.print("" + dis.readInt()+'\n');
                return dis.readInt();
            } catch (IOException ex) {
    
            }
            System.out.print("Non sono nel try"+'\n');
            return 0;
        }
    
        public void inviaDati(int val)
        {
            try {
                dos.writeInt(val);
            } catch (IOException ex) {
            }
        }
    }
    dovrebbe essere il minimo essenziale per scrivere se non sbaglio.. forse mi sono dimenticato qualcosa ma dovrebbe funzionare così.. Aiutatemi vi pregooo!!

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

    Re: [JAVA] DataInput/OutputStream nei Socket

    Originariamente inviato da xTuMiOx
    Spedendo i dati dal KeyPressed (cioè ogni volta che si cambia un personaggio) il gioco si blocca un paio di secondi e poi spedisce i numeri, e non è esattamente quello che voglio dato che deve essere una cosa fluida spedire un intero..
    Partiamo dalla questione dei (troppi) secondi. Se il socket è già attivo (già creato e aperto), impiegare svariati secondi solo per inviare 4 miseri byte mi pare una cosa davvero pazzesca, anche se la connessione fosse di quelle un po' sgalfe ....
    Vedo che nel tuo codice non hai usato alcun flush(). Invece dovresti usarlo dopo la writeInt().

    Poi il fatto di fare questo tipo di I/O direttamente nel contesto del EDT in risposta ad un evento .... beh, in effetti non è in ogni caso una buona/bella cosa.

    Qui, come spesso mi capita di vedere, non è tanto una questione tecnica ... ma di "design", di trovare la giusta "architettura" per realizzare le cose in modo pulito, astratto e ben separate (e magari riutilizzabili, a seconda del livello/contesto di utilizzo).

    Una possibile ipotesi, sebbene abbastanza estrema, potrebbe essere quella di fare la gestione in maniera completamente asincrona. La comunicazione vera e propria "gira" in un thread a parte. La GUI quindi non invia/riceve lei direttamente i dati ma si limita a comunicare con un "oggetto" che gestisce una "coda" di messaggi. Quindi la GUI potrebbe invocare un inviaDati(.....) che si limita solo a depositare dei dati nella coda (quindi ritorna in pratica immediatamente!) ed è il poi il thread a parte che estrae dalla coda (praticamente subito se non è "ingolfata" perché ce ne sono altri prima) il messaggio per inviarlo.
    Qualunque risultato o informazione di errore potrebbe poi essere notificato, anche qui in maniera "asincrona", alla GUI tramite un meccanismo di "callback" basato su una interfaccia (implementata dalla GUI da qualche parte).

    Questa come ripeto, è solo una delle possibili soluzioni. La questione è proprio solo di "design" della architettura.
    Probabilmente quella che ho descritto è forse un qualcosa di troppo estremo per il tuo giochino ... bisogna sempre vedere cosa si ha in "gioco" e il livello di prestazioni, scalabilità, riutilizzo che si vuole ottenere.
    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
    Registrato dal
    Feb 2010
    Messaggi
    15
    purtroppo mi sto avvicinando alla programmazione in java.. ho appena le base minime per creare una sorta di mini gioco.. lo scopo sarebbe l'uso dei socket e del double buffering per le immagini in modo che non ci sia lo sfarfallio.. quindi a me basta la cosa più semplice del mondo.. sui thread ho fatto pochissimi esempi quindi non saprei bene da dove partire, vorrei la soluzione anche più scarsa ma che funzioni.. per migliorarmi farò altri esercizi ovviamente.. ho letto sul web comunque che potrebbe essere un problema il fatto che sono collegato ad un router, mentre se procedessi direttamente il localhost dovrebbe velocizzarsi molto, ma non so esattamente quanto può essere un problema, in ogni caso entro sera provo e ti faccio sapere..

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    15
    ho provato in localhost apportando la modifica del flush e di fare la read() anzichè la readInt() che magari fa delle conversioni particolari ma non cambia assolutamente nulla purtroppo.. sono disposto a farvi avere tutto il progetto se volete..

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.