Visualizzazione dei risultati da 1 a 10 su 12

Hybrid View

  1. #1
    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());
       }
    }
    }

  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
    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

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.