Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Problema Socket Server

  1. #1

    Problema Socket Server

    Salve ragazzi, sono nuovo del forum, ho un problema sui socket in java, dunque cerco di spiegarmi, il codice che vedete qui sotto è un codice di "prova" che poi andrò ad inserire nel server vero e proprio, dunque dato che questo server comunica con una applicazione android, quindi avevo necessità di riuscire a chiudere il socket quando ad esempio lo smartphone android perde o volontariamete disattivo ad esempio la connesione wi fi, l'applicazione al prossimo tentativo di scrivere sul socket java da un IOException, e quindi catturata l'eccezione chiudo il socket, ma il server non si "accorge" diciamo che il client non è più raggiungibile e quindi il socket rimane aperto, e quindi mi sono creato questo straccio di codice per capire bene dove sia l'errore.

    codice:
    import java.io.*;import java.net.*;
    import java.util.*;
    
    
    public class TCPServer extends Thread {
        
        private int port;
        private ServerSocket server; 
        
        public TCPServer(int port)throws IOException{
            this.port=port;
            this.server = new ServerSocket(port);
        }
        
        @Override
        public void run(){        
            try{
                while(!Thread.interrupted()){
                    Socket conn = server.accept();
                    System.out.println("Connesso: "+ conn.getInetAddress().toString());
                    Connection c = new Connection(conn);
                    c.start();
                }
            }catch(IOException ex){
            }
        }
        
        public class Connection extends Thread{
            
            private Socket conn;
            private BufferedReader in;
            private BufferedWriter out;
            
            public Connection(Socket conn)throws IOException{
                this.conn = conn;
                this.in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                this.out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
            }
            
                
            @Override
            public void run(){
                try{
                    System.out.println("Attesa...");
                    Thread.sleep(10000);
                    this.out.write("check");
                    this.out.newLine();
                    this.out.flush();
                    System.out.println("Inviato");
                }catch(IOException ex){
                    System.out.println(ex.toString());
                }catch(InterruptedException ex){
                }
            }
        }
        
        public static void main(String[] args){
                try{
                    //TCPServer s = new TCPServer(Integer.parseInt(args[0]));
                    TCPServer s = new TCPServer(9000);
                    s.start();
                    int c = System.in.read();
                    s.interrupt();
                    s.join();
                }catch(IOException ex){
                }catch(InterruptedException ex){
                }
        }
    }
    Quindi secondo quanto accade sul applicazione, sul server dovrebbe succedere lo stesso, ovvero quando tento di scrivere con l'oggetto out la parola "check", l'eccezione non viene generata. Non so se mi sono spiegato, spero riusciate ad aiutarmi.
    Grazie mille

  2. #2
    Nessuno sa aiutarmi?

  3. #3
    Ciao Andrea, ho fatto una prova al volo con un client stupido:
    codice:
    public static void main(String[] args) throws UnknownHostException, IOException
    	{
    		Socket socket = new Socket("localhost", 9000);
    		InputStream in = socket.getInputStream();
    		OutputStream out = socket.getOutputStream();
    		System.out.println("CLIENT CONNECTED");
    	}
    Come vedi il client si connette e poi muore.
    Ovviamente sul server quando tenta di scrivere sullo stream viene sollevata una IOException.

    P.S
    Non ammazzare mai le eccezioni nè con catch vuoti ne con System.out.println(e.getMessage()). Ma fatti stampare sempre tutto lo stackTrace

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Cosa accade sulla console del server?

    Le comunicazioni client/server sono sempre "piuttosto delicate".
    Maggiormente lo sono quelle tra dispositivi mobili: il mio suggerimento (basato su esperienza personale) è quello di evitare completamente di tenere su la connessione; il motivo è molto semplice: la connessione di un dispositivo mobile cade molto più spesso di quanto non si immagini. Mi capitava di veder cadere la connessione anche rimanendo perfettamente fermo. Per questo motivo sono "migrato" verso un protocollo "connection-less": ogni richiesta che il dispositivo fa al server si traduce sempre in

    1) nuova connessione
    2) invio richiesta
    3) attesa risposta
    4) chiusura connessione

    (che è esattamente ciò che accade con le normalissime connessioni HTTP e/o verso WebServices)


    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

  5. #5
    Il problema è proprio questo, ho provato con questo client che mi hai scritto...in pratica ho avviato il server su un altro pc, e su un altro il client, lo sleep di 10 secondi sul server mi permette di scollegare la mia connesione su il pc, e quindi di conseguenza il server dovrebbe generare un eccezione, dato che il client non è più raggiungibile, ma ciò non accade..

  6. #6
    Purtroppo non posso usare connessioni HTTP, perchè il server è utilizzato per controllare un robot con raspberryPi e quindi su un dispositivo mobile, il dover ogni volta aprire una nuova connesione, invia, e attendere, e poi chiudere comporta un lag notevole sul controllo del robot

  7. #7
    Quote Originariamente inviata da andrea9671 Visualizza il messaggio
    Il problema è proprio questo, ho provato con questo client che mi hai scritto...in pratica ho avviato il server su un altro pc, e su un altro il client, lo sleep di 10 secondi sul server mi permette di scollegare la mia connesione su il pc, e quindi di conseguenza il server dovrebbe generare un eccezione, dato che il client non è più raggiungibile, ma ciò non accade..
    Se hai usato il mio client non c'è bisogno di scollegare la connessione, in quanto il client muore subito dopo avere creato il socket, quindi cmq sia sul server dopo lo sleep si dovrebbe verificare la IOException.

  8. #8
    Certo certo, ma purtroppo non accade stampa inviato e non riesco a capire il motivo

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da andrea9671 Visualizza il messaggio
    Purtroppo non posso usare connessioni HTTP

    Non ho detto che ho usato connessioni HTTP, né che dovresti usarle tu... Ho solo detto che il meccanismo di funzionamento che ho adottato è esattamente come quello che avviene con le connessioni HTTP.
    Ad ogni modo, ho copiato e incollato il codice del tuo server. Ho scritto un client stupido come quello postato da francesco.muia.

    Questa la console del server:

    codice:
    Connesso: /127.0.0.1
    Attesa...
    java.net.SocketException: Connection reset by peer: socket write error

    Come vedi, l'eccezione c'è eccome.


    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

  10. #10
    sh1.jpgsh2.jpgNon so per qualche strano motivo ma non mi funziona non genera eccezioni
    Immagini allegate Immagini allegate
    Ultima modifica di andrea9671; 20-01-2015 a 17:06

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.