| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | ?: socket, streams og manglende eof signal Fra : Anders Hansen | 
  Dato :  17-02-02 20:56 |  
  |   
            Hejsa...
 Jeg har et lille problem - jeg forsøger at skrive noget java der kan flytte
 en fil over netværket!
 Jeg læser først hele filen ind i et byte array, derefter sender jeg den
 afsted på netværket ved hjælp af en PrintStream(sock.getOutputStream())
 konstruktion... Og det går fint, alle data kommer fint afsted og bliver
 modtaget af en BufferedInputStream(sock.getInputStream()).
 Så langt så godt, men den løkke der står og modtager dataene, får aldrig eof
 (-1) signalet!? Efter den har læst de sidste data står den bare og venter!
 Hvad skal gøre anderledes.
 Er der evt. nogle bedre måder at sende filerne afsted på?
 
 MVH/Anders
 
 
  
            
             |   |   
            
        
 
            
         
           Filip Larsen (17-02-2002) 
         
	
            | Kommentar Fra : Filip Larsen | 
  Dato :  17-02-02 21:31 |  
  |   
            Anders Hansen skrev
 
 > Jeg har et lille problem - jeg forsøger at skrive noget java der kan
 flytte
 > en fil over netværket!
 > Jeg læser først hele filen ind i et byte array, derefter sender jeg den
 > afsted på netværket ved hjælp af en PrintStream(sock.getOutputStream())
 > konstruktion... Og det går fint, alle data kommer fint afsted og bliver
 > modtaget af en BufferedInputStream(sock.getInputStream()).
 > Så langt så godt, men den løkke der står og modtager dataene, får aldrig
 eof
 > (-1) signalet!? Efter den har læst de sidste data står den bare og venter!
 
 Hvis du sender binær data kan du sende direkte med
 OutputStream.write(byte[],int,int). At bruge en PrintWriter er overflødigt.
 Og du skal huske at flushe output til sidst. Fx noget lignende følgende
 metode:
 
 -----------------
 import java.io.*;
 
 ....
 
 void static transfer(InputStream in, OutputStream out)
   throws IOException
 {
   byte[] buffer = new byte[2048];
   while (true) {
     int len = in.read(buffer,0,buffer.length);
     if (len < 0) break;
     out.write(buffer,0,len);
   }
   out.flush();
 }
 ------------------
 
 Bemærk, at hvis man selv bruger en forholdvis stor buffer så er der ikke
 behov for at bruge nogle af java.io pakkens buffered input/output streams,
 man kan læse og skrive direkte på de underliggende streams uden performance
 tab. Man behøver heller ikke læse hele filen ind først, med mindre man skal
 sende den flere gange. At holde en stor fil i en buffer er forholdmæssigt
 dyrt.
 
 
 Mvh,
 --
 Filip Larsen <filip.larsen@mail.dk>
 
 
  
            
             |   |   
            
        
 
            
         
           Anders Hansen (17-02-2002) 
         
	
            | Kommentar Fra : Anders Hansen | 
  Dato :  17-02-02 21:57 |  
  |   
            Tak for den hurtige respons.. jeg har nu prøvet (efter evne) at følge dit
 forslag:
 sender:
      OutputStream os = sock.getOutputStream();
      os.write(buffer,0,buffer.length);
      os.flush();
 
 modtager:
        InputStream is = sock.getInputStream();
        while( (j = is.read(buffer,0,4096)) != -1 ) {
         fos.write(buffer,0,j);
         System.out.println("bytes read: " + j);
        }
        System.out.println("OK");
 men jeg kommer aldrig til OK alligevel... Jeg modtager hele filen ingen
 problemer der, det er bare det EOF signal der mangler.
 
 MVH/Anders
 
 
 "Filip Larsen" <filip.larsen@mail.dk> skrev i en meddelelse
 news:poUb8.369$z7.105491@news000.worldonline.dk...
 > Hvis du sender binær data kan du sende direkte med
 > OutputStream.write(byte[],int,int). At bruge en PrintWriter er
 overflødigt.
 > Og du skal huske at flushe output til sidst. Fx noget lignende følgende
 > metode:
 >
 > -----------------
 > import java.io.*;
 >
 > ...
 >
 > void static transfer(InputStream in, OutputStream out)
 >   throws IOException
 > {
 >   byte[] buffer = new byte[2048];
 >   while (true) {
 >     int len = in.read(buffer,0,buffer.length);
 >     if (len < 0) break;
 >     out.write(buffer,0,len);
 >   }
 >   out.flush();
 > }
 > ------------------
 >
 > Bemærk, at hvis man selv bruger en forholdvis stor buffer så er der ikke
 > behov for at bruge nogle af java.io pakkens buffered input/output streams,
 > man kan læse og skrive direkte på de underliggende streams uden
 performance
 > tab. Man behøver heller ikke læse hele filen ind først, med mindre man
 skal
 > sende den flere gange. At holde en stor fil i en buffer er forholdmæssigt
 > dyrt.
 >
 >
 > Mvh,
 > --
 > Filip Larsen <filip.larsen@mail.dk>
 >
 >
 
 
  
            
             |   |   
            
        
 
            
         
            Lars Dam (17-02-2002) 
         
	
            | Kommentar Fra : Lars Dam | 
  Dato :  17-02-02 22:06 |  
  |   
            On Sun, 17 Feb 2002 21:57:03 +0100, "Anders Hansen"
 <isl45662@image.dk> wrote:
 
 >Tak for den hurtige respons.. jeg har nu prøvet (efter evne) at følge dit
 >forslag:
 >sender:
 >     OutputStream os = sock.getOutputStream();
 >     os.write(buffer,0,buffer.length);
 >     os.flush();
 >
 >modtager:
 >       InputStream is = sock.getInputStream();
 >       while( (j = is.read(buffer,0,4096)) != -1 ) {
 >        fos.write(buffer,0,j);
 >        System.out.println("bytes read: " + j);
 >       }
 >       System.out.println("OK");
 >men jeg kommer aldrig til OK alligevel... Jeg modtager hele filen ingen
 >problemer der, det er bare det EOF signal der mangler.
 
 det er fordi du checker på eof; eof kommer kun hvis streamenm
 detekterer et eof, hvilket den tilsyneladende ikke gør i din
 situation; så istedet for at venter på eof; så læs indtil du har
 modtaget x karakterer, og glem  alt om eof, som 'terminator'. Gør kun
 brug af eof, hvis du får en for tidlig afslutning af læs'en.
 
 vh.ld
 
  
            
             |   |   
            
        
 
            
         
             Anders Hansen (17-02-2002) 
         
	
            | Kommentar Fra : Anders Hansen | 
  Dato :  17-02-02 22:19 |  
  |   
            OK - tak for hjælpen
 
 MVH/Anders
 
 "Lars Dam" <larsdamXXspamXXprotectionXX@post2.tele.dk> skrev i en meddelelse
 news:cm607uklhh2ola7re11p1nr6d7to8o0mb0@4ax.com...
 > On Sun, 17 Feb 2002 21:57:03 +0100, "Anders Hansen"
 > <isl45662@image.dk> wrote:
 >
 > >Tak for den hurtige respons.. jeg har nu prøvet (efter evne) at følge dit
 > >forslag:
 > >sender:
 > >     OutputStream os = sock.getOutputStream();
 > >     os.write(buffer,0,buffer.length);
 > >     os.flush();
 > >
 > >modtager:
 > >       InputStream is = sock.getInputStream();
 > >       while( (j = is.read(buffer,0,4096)) != -1 ) {
 > >        fos.write(buffer,0,j);
 > >        System.out.println("bytes read: " + j);
 > >       }
 > >       System.out.println("OK");
 > >men jeg kommer aldrig til OK alligevel... Jeg modtager hele filen ingen
 > >problemer der, det er bare det EOF signal der mangler.
 >
 > det er fordi du checker på eof; eof kommer kun hvis streamenm
 > detekterer et eof, hvilket den tilsyneladende ikke gør i din
 > situation; så istedet for at venter på eof; så læs indtil du har
 > modtaget x karakterer, og glem  alt om eof, som 'terminator'. Gør kun
 > brug af eof, hvis du får en for tidlig afslutning af læs'en.
 >
 > vh.ld
 >
 
 
  
            
             |   |   
            
        
 
            
         
             Christian Hemmingsen (18-02-2002) 
         
	
            | Kommentar Fra : Christian Hemmingsen | 
  Dato :  18-02-02 00:49 |  
  |   
            Lars Dam <larsdamXXspamXXprotectionXX@post2.tele.dk> writes:
 
 > >men jeg kommer aldrig til OK alligevel... Jeg modtager hele filen ingen
 > >problemer der, det er bare det EOF signal der mangler.
 > 
 > det er fordi du checker på eof; eof kommer kun hvis streamenm
 > detekterer et eof,
 
 EOF betyder "End Of File". Du snakker med en socket, ikke en fil, så
 det er ikke så underligt at du aldrig får EOF. 
 Husker du at lukke din Socket i den ende der sender? I så fald burde
 du så få en IOException (broken pipe) hvis du læser efter den er
 lukket. Nu er Exceptions jo dyre, så en mere elegant løsning er nok at
 foretrække.
 
 -- 
 Christian Hemmingsen
  
            
             |   |   
            
        
 
            
         
              Morten (18-02-2002) 
         
	
            | Kommentar Fra : Morten | 
  Dato :  18-02-02 11:37 |  
  |   
            Christian Hemmingsen wrote:
 > 
 > EOF betyder "End Of File". Du snakker med en socket, ikke en fil, så
 > det er ikke så underligt at du aldrig får EOF. 
 > Husker du at lukke din Socket i den ende der sender? I så fald burde
 > du så få en IOException (broken pipe) hvis du læser efter den er
 > lukket. Nu er Exceptions jo dyre, så en mere elegant løsning er nok at
 > foretrække.
 > 
 > 
 
 Nu kan en fil godt være et lidt mere abstrakt begreb end du
 ligger op til. Fex. kan en DataInputStream.readFully kaste en
 EOFException hvis strømmen terminerer før alle bytes er læst.
 
 Derudover kan du læse API'et for java.net.Socket og søge på EOF
 deri :)
 
 Morten
 
  
            
             |   |   
            
        
 
            
         
           Lars Dam (17-02-2002) 
         
	
            | Kommentar Fra : Lars Dam | 
  Dato :  17-02-02 21:43 |  
  |   
            On Sun, 17 Feb 2002 20:56:15 +0100, "Anders Hansen"
 <isl45662@image.dk> wrote:
 
 >Hejsa...
 >Jeg har et lille problem - jeg forsøger at skrive noget java der kan flytte
 >en fil over netværket!
 >Jeg læser først hele filen ind i et byte array, derefter sender jeg den
 >afsted på netværket ved hjælp af en PrintStream(sock.getOutputStream())
 >konstruktion... Og det går fint, alle data kommer fint afsted og bliver
 >modtaget af en BufferedInputStream(sock.getInputStream()).
 >Så langt så godt, men den løkke der står og modtager dataene, får aldrig eof
 >(-1) signalet!? Efter den har læst de sidste data står den bare og venter!
 >Hvad skal gøre anderledes.
 >Er der evt. nogle bedre måder at sende filerne afsted på?
 
 Det kan være at du bliver nødt til at lukke socket'en med close() før
 din eof kommer frem. Alternativt, så send længden af bytes som det
 første, og send så derefter filen; så ved du hvor mange bytes du skal
 læse.
 
 >MVH/Anders
 
 vh. ld
 
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |