Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    16

    Errore con comunicazione client/server

    Sono un programmatore Java alle prime armi, non riesco a implementare una semplice comunicazione client/server:

    Quando lancio il client dopo aver lanciato il server mi appare sul pannello "Console" (uso Eclipse) il seguente
    output:

    Server in attesa sulla porta 2012 (2013)
    Connessione avvenuta
    ECCEZIONE Server: java.net.SocketException: Connection reset

    Qualcuno puo' aiutarmi per favore?

    ********** Client.java **********
    codice:
    import java.net.*;
    import java.io.*;
    
    public class Client
    {
    
        public static void main(String[] args)
        {
            Socket client;
            OutputStream out;
            ObjectOutputStream oos;
            
            
            String serverName="127.0.0.1";
            int port=2013; // 2012
    
            try
            {
            System.out.println("Connessione a " + serverName + " sulla porta " + port);
            client = new Socket(serverName, port);
              
            System.out.println("Collegato a " + client.getRemoteSocketAddress());
            
            out=client.getOutputStream();
            oos=new ObjectOutputStream(out);
            
            oos.writeUTF("Prova");
            
            
            }
            catch (Exception exc)
            {
                System.out.println("ECCEZIONE Client: "+exc.toString());
            }
            
        }
    
    }

    ********** Server.java **********
    codice:
    import java.io.*;
    import java.net.*;
    
    public class Server
    {
    
    
        public static void main(String[] args)
        {
        Socket s;
        ServerSocket ss;
        InputStream in;
        ObjectInputStream ois;
        String messaggio="indefinito";
            
            try
            {
                ss = new ServerSocket(2013); // 2012
                ss.setSoTimeout(50000); // 100000 
                
                System.out.println("Server in attesa sulla porta 2012 (2013)");
                s=ss.accept();
                
                System.out.println("Connessione avvenuta");
                
                in=s.getInputStream();
                
                ois=new ObjectInputStream(in);    
                messaggio=ois.readUTF();
                
                System.out.println("Il client ha inviato: "+messaggio);
                
            }
            catch (Exception exc)
            {
                System.out.println("ECCEZIONE Server: "+exc.toString());
            }
            
        }
    
    }

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da abcx Visualizza il messaggio
    Quando lancio il client dopo aver lanciato il server mi appare sul pannello "Console" (uso Eclipse) il seguente
    output:

    Server in attesa sulla porta 2012 (2013)
    Connessione avvenuta
    ECCEZIONE Server: java.net.SocketException: Connection reset
    Nel Client, dopo il writeUTF aggiungi:

    oos.flush();
    client.close();
    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
    Dec 2016
    Messaggi
    16
    Adesso funziona, GRAZIE.

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    16
    La seguente comunicazione client/server funziona per una porta diversa dalla 2012, mentre su quella porta quando
    lancio il server mi appare il seguente output:


    Server in attesa sulla porta 2012
    Connessione avvenuta
    ECCEZZIONE Server: java.io.StreamCorruptedException: invalid stream header: 0201F900



    ********** Client.java **********
    codice:
    import java.net.*;
    import java.io.*;
    
    public class Client
    {
    
        public static void main(String[] args)
        {
            Socket client;
            OutputStream out;
            ObjectOutputStream oos;
            String messaggioDaInviareAlServer;
            
            messaggioDaInviareAlServer="Ciao ciao";
            
            String serverName="127.0.0.1";
            int port=2012; // 2012 // <----- PORTA
    
            try
            {
            System.out.println("Connessione a " + serverName + " sulla porta " + port);
            client = new Socket(serverName, port);
              
            System.out.println("Collegato a " + client.getRemoteSocketAddress());
            
            out=client.getOutputStream();
            oos=new ObjectOutputStream(out);
            
            oos.writeUTF(messaggioDaInviareAlServer);
            
            oos.flush();
            client.close();
            
            }
            catch (Exception exc)
            {
                System.out.println("ECCEZIONE Client: "+exc.toString());
            }
            
        }
    
    }

    ********** Server.java **********
    codice:
    import java.net.*;
    import java.io.*;
    
    public class Server extends Thread {
        private ServerSocket serverSocket;
        InputStream in;
        ObjectInputStream ois;
        String messaggio;
    
        public Server(int port) throws IOException
        {
            serverSocket = new ServerSocket(port);
            serverSocket.setSoTimeout(100000); // Moltiplicato per 10 // se 0 loop infinito
        }
    
        public void run()
        {
            while (true)
            {
                try
                {
                    System.out.println("\nServer in attesa sulla porta "+serverSocket.getLocalPort()); 
                    Socket server = serverSocket.accept();
             
                    //System.out.println("Connessione avvenuta: " + server.getRemoteSocketAddress());
                    System.out.println("Connessione avvenuta");
             
                    in=server.getInputStream();
             
                    ois=new ObjectInputStream(in);    
                    messaggio=ois.readUTF();
                
                    System.out.println("Il client ha inviato: "+messaggio);         
                    
                    // if readUTF() è uguale a "FINE" allora server.close();
                    //server.close();
             
                }
                catch(SocketTimeoutException s)
                {
                    //System.out.println("Socket timed out!");
                    System.out.println("Tempo scaduto - connessione interrotta");
                    break;
                }
                catch(Exception exc)
                {
                    System.out.println("ECCEZZIONE Server: "+exc.toString());
                    break;
                }
            }
    }
    
    public static void main(String [] args)
    {
       int port=2012; // 2012 <----- PORTA
       try {
          Thread t = new Server(port);
          t.start();
       }
       catch(Exception exc)
       {
           System.out.println("ECCEZZIONE Server: "+exc.toString());
       }
    }
    }

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da abcx Visualizza il messaggio
    Server in attesa sulla porta 2012
    Connessione avvenuta
    ECCEZZIONE Server: java.io.StreamCorruptedException: invalid stream header: 0201F900
    A parte il fatto che nel Server il server.close() è "commentato" e quindi non stai chiudendo la comunicazione verso il client (ma questo è il problema/male minore), NON vedo errori "palesi" tali da portare ad un StreamCorruptedException.

    ObjectOutputStream e ObjectInputStream servono principalmente per sfruttare la "serializzazione" degli oggetti. Cosa che tra l'altro in questo momento non stai sfruttando perché i readUTF/writeUTF NON fanno parte della serializzazione, essi sono semplicemente dei metodi ereditati rispettivamente dai DataInputStream/DataOutputStream.

    La serializzazione degli oggetti prevede un protocollo "binario" ben preciso, che contempla la presenza di un "magic header" iniziale che serve appunto a demarcare l'inizio dello stream della serializzazione.

    Un "StreamCorruptedException: invalid stream header" significa che qualcuno/qualcosa ha cercato di inviare al ObjectInputStream dei dati che NON rispettano il protocollo binario della serializzazione, in particolare proprio riguardo quel header iniziale.

    In sostanza vuol dire: che o hai fatto prove "strane" di invio verso il server o hai tentato di connetterti e comunicare con il server con qualche altro tool o applicazione oppure ancora c'è qualcosa nel tuo sistema che cerca di connettersi verso quella porta senza sapere che dietro c'è Java e la (de)serializzazione degli oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    16
    Quindi se provo a ri-scrivere il client.java e il server.java in PHP dovrebbe funzionare?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da abcx Visualizza il messaggio
    Quindi se provo a ri-scrivere il client.java e il server.java in PHP dovrebbe funzionare?
    Quello che hai scritto di per sé funziona. Cosa c'entra PHP? (oltre al fatto che PHP è orientato alle pagine web "dinamiche" ... non alla comunicazione diretta su socket).
    Cosa stai cercando di fare? Quale è il motivo per cui vuoi passare da un linguaggio ad un altro completamente diverso solo per dei socket TCP?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    16
    Bisogna in tutti i modi che la connessione client/server funzioni anche su quella porta, te cosa mi consigli?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da abcx Visualizza il messaggio
    Bisogna in tutti i modi che la connessione client/server funzioni anche su quella porta, te cosa mi consigli?
    Veramente, come ti ha già detto andbin, non c'entra nulla la porta, non c'entra nulla il server... c'entra solo che c'è un client (chi? boh!) che sta cercando di connettersi su quella porta senza conoscerne il protocollo.

    E' come se io cercassi di connettermi con telnet ad un server sulla porta in cui è in ascolto VNC... non funzionerebbe nulla, ma non è né colpa di VNC, né della porta che lui usa... la colpa è mia (client) che sto cercando di connettermi ad un software senza conoscerne il protocollo di comunicazione.


    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
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    16
    Vi descrivo a questo punto la situazione:
    Ho un antenna rfid che legge adegli eventuali tag rfid che transitano sopra di essa;
    l'antenna è configurata in "Notification Mode" ovvero ogni volta che un tag la attraversa, questa invia cio che legge nel tag (una stringa) verso un server (192.168.16.142:2012 il mio computer:la mia porta di ascolto).
    Il server è appunto questa applicazione in java composta da un socket che stampa a video tutto cio che gli viene inviato.
    Ho provato tramite netstat -a -b a vedere cosa ho in ascolto sulle porte, ma la 2012 non è tra quelle in uso.

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.