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