Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problema object input/output stream

    Ciao ragazzi, devo progettare didatticamente un'applicazione client/sever...
    Il mio dilemma è questo.... Supponendo che un'applicazione server abbia opportunamente(spero) lanciato una ServerSocket sulla porta 16000, seguita dalla accept(), come mai nel momento in cui lo lancio il client resta bloccato su questo stralcio di codice?

    codice:
    Socket server= new Socket("localhost", 16000); 
    ObjectOutputStream out= new ObjectOutputStream(server.getOutputStream()); ObjectInputStream in= new ObjectInputStream(server.getInputStream()); System.out.println("\nInserire la targa del veicolo in uscita: ");



    In esecuzione la stringa per inserire la targa non viene visualizzata, si blocca prima...

    Grazie anticipatamente

  2. #2
    Non so esattamente perche' si blocca ma lato client devi eseguire
    la chiamata a connect prima di poter leggere dallo stream.
    Inoltre ti consiglio si darti un occhiata ai SocketChannel , che sono una API Java di rete piu' recente

  3. #3
    Da quel che leggo nella documentazione ufficiale, la connect va fatta nel momento in cui dichiaro la Socket in questo modo:

    new Socket()

    Ma se passo già come parametri indirizzo e porta, la connect viene automaticamente eseguita.... il problema credo lo dia la ObjectInputStream, in quanto la connessione avviene (ho messo un println dopo la chiamata a socket per verificarlo) .... La cosa assurda è che in altri algoritmi dello stesso programma la stessa sequenza funziona... Non capisco proprio..

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Devi tenere a mente una cosa molto importante: se nel server apri (ottieni) per prima il canale di Input (InputStream), nel client dovrai obbligatoriamente aprire (ottenere) per primo il canale di output (OutputStream) e viceversa. L'apertura degli stream va sempre fatta incrociata. Altrimenti il client si blocca subito senza apparente motivo.

    Dalla Java Object Serialization Specification
    The ObjectInputStream constructor blocks until it completes reading the serialization stream header. Code which waits for an ObjectInputStream to be constructed before creating the corresponding ObjectOutputStream for that stream will deadlock, since the ObjectInputStream constructor will block until a header is written to the stream, and the header will not be written to the stream until the ObjectOutputStream constructor executes. This problem can be resolved by creating the ObjectOutputStream before the ObjectInputStream, or otherwise removing the timing dependency between completion of ObjectInputStream construction and the creation of the ObjectOutputStream.
    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
    Grazie per la risposta, incollo nello specifico i codici cliente e server così puoi dirmi se il ragionamento calza con il tuo suggerimento

    SERVER SIDE:

    codice:
    server= new ServerSocket(16000);
    
    Socket client= server.accept(); 
    
    System.out.println("\nNuova richiesta access point"); 
    
    ObjectOutputStream out= new ObjectOutputStream(client.getOutputStream()); ObjectInputStream in= new ObjectInputStream(client.getInputStream()); 
    
    String operazione= in.readObject().toString(); 
    
    System.out.println(operazione); 
    
    switch(operazione) {.......
    CLIENT SIDE:

    codice:
    Socket server= new Socket("localhost", 16000); 
    
    ObjectInputStream in= new ObjectInputStream(server.getInputStream()); 
    ObjectOutputStream out= new ObjectOutputStream(server.getOutputStream()); 
    
    System.out.println("\nInserire la targa del veicolo in uscita: "); 
    
    String targa= r.readLine(); 
    
    out.writeObject("uscita"); 
    out.writeObject(targa); 
    
    Ingresso i= (Ingresso) in.readObject(); 
    System.out.println(i);

    Lato client non arriva nemmeno a stamparmi la prima stringa di richiesta inserimento targa

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Di primo acchitto direi che è tutto giusto... sicuro che non vengano sollevate eccezioni prima della stampa della scritta (sia sul cliente, che sul server)? Nella parte di codice che hai postato non si vede il trattamento delle eccezioni, ma mi auguro che tu abbia inserito gli appositi printStackTrace().


    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

  7. #7
    Ti ringrazio, avevo dimenticato un printStackTrace() giusto dove sollevava una EOF exception dovuta alla cosa più idiota del mondo.... Avevo dimenticato il break; nello switch....... Problema risolto... Grazie mille

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 © 2024 vBulletin Solutions, Inc. All rights reserved.