Newsgroup: it.comp.java
Titolo: Socket Java

Sto facendo un'applicazione JAVA che consenta ad un client remoto di
prelevare un file da un server, inviato attraverso una socket.
Sul client mi compare questo errore:
Eccezionejava.net.SocketException: Software caused connection
abort: JVM_recv in socket input stream read
Qualcuno sa' dirmi da cosa può dipendere?
Ciao e grazie.
--------------------------------
Inviato via 
http://usenet.libero.it

 wrote in message
news:81Z73Z181Z173Y1...@usenet.libero.it...


Ecco il codice incriminato.
CLIENT
import java.net.*;
import java.io.*;
public class ProvaSocket extends Socket
     {
     public static void main(String []arg)
          {
          try
            {
            String file ="c://net//JavaVocalMeeting.java";
            Socket socket = new Socket("host",8080);
 
            BufferedOutputStream buffout = new
BufferedOutputStream(socket.getOutputStream());
            DataOutputStream out = new DataOutputStream(buffout);
 
            DataInputStream in = new DataInputStream(socket.getInputStream());
 
            // Questa è la stringa di connessione
            out.writeBytes("GET " + file + " HTTP/1.1\r\n\r\n");
            out.flush();
 
            System.out.print("Download in corso... ");
            File fileop = new File("c:\\JavaVocalMeeting.java");
            FileOutputStream fileout = new FileOutputStream(fileop);
 
            int dato = 0;
            while((dato=in.read())!=-1)
                fileout.write(dato);
            fileout.flush();
            System.out.println("\nDownload completato");
            fileout.close();
            in.close();
            socket.close();
            }
          catch(UnknownHostException e)
              {
              System.out.println("Eccezione" +e);
              }
          catch(IOException e)
              {
              System.out.println("Eccezione" +e);
              }
          }
     }
SERVER
import java.io.*;
import java.lang.*;
public class ProvaServerSocket extends Socket
     {
     public static void main(String []arg)
          {
          try
            {
            ServerSocket server = new ServerSocket(8080);
            Socket client = server.accept();
 
            //BufferedReader in = new BufferedReader(new
InputStreamReader(client.getInputStream()));
            DataOutputStream out = new DataOutputStream(client.getOutputStream());
            File f = new File("c:\\net\\JavaVocalMeeting.java");
            int dim = (int)(f.length());
            if(dim == 0)
             throw new IOException("Il file è vuoto");
            else
             {
             System.out.println("Grandezza file: " +dim);
             FileInputStream fin = new FileInputStream(f);
             DataInputStream file = new DataInputStream(fin);
             byte blocco[] = new byte[dim];
             file.read(blocco);
             out.write(blocco);
             out.flush();
             System.out.println("File inviato");
             file.close();
             fin.close();
             out.close();
             }
            }
          catch(UnknownHostException e)
              {
              System.out.println("Eccezione" +e);
              }
          catch(IOException e)
              {
              System.out.println("Eccezione" +e);


             Socket socket = new Socket("host",8080);
?? sei sicuro della stringa "host" piuttosto metterei 127.0.0.1
ilcario


Secondo me "host" è stato messo solo come esempio... Non credo che vada a
piazzare la stringa "host" come host.... Ovvero il problema dev'essere un
altro :)




Scusami, hai ragione. Messa cosi, la cosa è fuorviante. "Host" è
un'etichetta che ho messo a caso... Nel programma al suo posto c'è il nome
del PC che funge da server nella mia applicazione. Comunque, ho fatto
diversi tentativi e credo che il problema sia legato alla chiusura della
SOCKET e degli STREAM. C'è per caso un ordine preciso da seguire?
Ciao e grazie.


Da quello che ho capito io la lettura deve avvenire via http, giusto?!
L'host che risponde sulla 8080 è un web/application server... giusto?!
Perchè complicarsi la vita con le socket?!
Io utilizzerei la URLConnection (package 
java.net
)
Semplice, preciso... ed efficace per i collegamenti http.
Se vuoi posto un po' di codice d'esempio, ma la documentazione in merito è
semplice e ben fatta...
Facci sapere, ok?!
Resta il fatto che verifico il codice che hai postato (a prima vista sembra
corretto :-)
Amedeo.
"Paolo" <pablo....@SPAMMONElibero.it> wrote in message
news:81Z73Z181Z173Y1...@usenet.libero.it...


 wrote in message
news:asl92u$5vba$1...@stargate1.inet.it...


Scusami, hai ragione. Messa cosi, la cosa è fuorviante. "Host" è
un'etichetta che ho messo a caso... Nel programma al suo posto c'è il nome
del PC che funge da server nella mia applicazione. Comunque, ho fatto
diversi tentativi e credo che il problema sia legato alla chiusura della
SOCKET e degli STREAM. C'è per caso un ordine preciso da seguire?
Ciao e grazie.


 SOCKET e degli STREAM. C'è per caso un ordine preciso da seguire?
E' probabile che il Server chiuda il canale prima ancora che il client abbia
ricevuto tutti i dati
prova a non chiuderlo,
public class ProvaServerSocket extends Socket{
     public static void main(String []arg){
    ...
    //out.close();
    ...
    }
}
ilcario


Intanto grazie per la risposta. Le mie prove sono giunte credo alla
conclusione perchè adesso il file viene trasferito regolarmente. L'unica
cosa che non và e che non mi consente si fare due trasferimenti consecutivi.
Al contrario se tra un trasferimento e l'altro faccio passare qualche
secondo, l'operazione non da' problemi. Pare quasi che la porta non venga
rilasciata nel momento in cui chiudo la socket. Bo'... Tu sai nulla in
proposito?


 proposito?
mi dispiace ma non ne ho idea, credo che a questo punto ti convenga provare
con versioni differenti di jvm, a volte è utile per capire dove stà il
problema.
quello che non mi è chiaro è se adesso chiudi lo stream dal lato server
oppure no?
Se ti va prova a ripostare il sorgernte Java che hai modificato.
ciao
ilcario


Ecco il codice lato server:
import java.net.*;
import java.io.*;
import java.lang.*;
public class ProvaServerSocket
     {
     public static void main(String []arg)
          {
          try
            {
            String line ="";
            ServerSocket server = new ServerSocket(8080);
            Socket client = server.accept();
 
            //BufferedReader in = new BufferedReader(new InputStreamReader
              (client.getInputStream()));
            DataOutputStream out = new DataOutputStream(client.getOutputStream());
            File f = new File("c:\\net\\JavaVocalMeeting.java");
            int dim = (int)(f.length());
            if(dim == 0)
             throw new IOException("Il file è vuoto");
            else
             {
             System.out.println("Grandezza file: " +dim);
             FileInputStream fin = new FileInputStream(f);
             DataInputStream file = new DataInputStream(fin);
             byte blocco[] = new byte[dim];
             file.read(blocco);
             out.write(blocco);
             out.flush();
             System.out.println("File inviato");
             file.close();
             fin.close();
             out.close();
             client.close();
             server.close();
             }
            }
          catch(UnknownHostException e)
              {
              System.out.println("Eccezione" +e);
              }
          catch(IOException e)
              {
              System.out.println("Eccezione" +e);
              }
          }
     }
Ciao e grazie!!!
