Avatar billede tripwire Nybegynder
04. april 2004 - 22:20 Der er 31 kommentarer og
1 løsning

Send en fil over netværks socket

Jeg skal bruge et komplet eksempel.

jeg har en client og en server som er forbundet via sockets.. De snakker med hinanden via bufferedreader og printwriter. Hvordan sender jeg en fil fra serveren til klienten?

Og det skal kunne være alle slags fil formater den skal kunne sende f.eks. ".swf" ".rar" ".pdf" ".png".

En fil fra serveren skal overføres til klienten, via sockets.

nogen der har noget kode der viser dette??
Avatar billede arne_v Ekspert
04. april 2004 - 22:23 #1
Du har 3 muligheder:

1)  kun tekst filer

2)  drop bufferedreader og printwriter

3)  flyt filerne base64 encoded (+33% i størrelse)

for bufferedreader og printwriter og binære filer er ikke en god cocktail.
Avatar billede arne_v Ekspert
04. april 2004 - 22:24 #2
Men jeg kan sagtens lave et lille eksempel for den af de 3 løsninger du
foretrækker.
Avatar billede tripwire Nybegynder
04. april 2004 - 22:28 #3
Hvordan og hvorledes med løsning 2??
*og tak for hurtigt svar*
Avatar billede arne_v Ekspert
04. april 2004 - 22:30 #4
BufferedInputStream og BufferedOutputSTream eller bare InputStream og OutputStream.

Man starter med at sende længden.
Avatar billede arne_v Ekspert
04. april 2004 - 22:31 #5
Jeg laver lige et lille eksempel.
Avatar billede arne_v Ekspert
04. april 2004 - 22:36 #6
Super simpelt eksempel:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();
        InputStream is = s.getInputStream();
        OutputStream os = new FileOutputStream("C:\\z2.zip");
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            os.write(b, 0, n);
        }
        os.close();
        is.close();
    }
}
Avatar billede arne_v Ekspert
04. april 2004 - 22:36 #7
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("localhost", 9999);
        OutputStream os = s.getOutputStream();
        InputStream is = new FileInputStream("C:\\z1.zip");
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            os.write(b, 0, n);
        }
        os.close();
        is.close();
    }
}
Avatar billede arne_v Ekspert
04. april 2004 - 22:37 #8
Client uploader z1.zip til Server som z2.zip
Avatar billede arne_v Ekspert
04. april 2004 - 22:39 #9
Her lukker jeg socket når upload er færdig. Skal socket genbruges er man
nødt til at sende en længde først så modtager ved hvornår alle bytes
er nået frem.

DataInputStream og DataOutputStream kan være gode til det.
Avatar billede repsak Nybegynder
04. april 2004 - 22:41 #10
bare nysgerig...
hvad er princippet i "3)  flyt filerne base64 encoded (+33% i størrelse)"
Avatar billede tripwire Nybegynder
04. april 2004 - 22:42 #11
socket skal genbruges.. der skal muligvis sendes flere filer nemlig..
Avatar billede arne_v Ekspert
04. april 2004 - 22:43 #12
repsak>

Man encoder filen i base64 (ligesom email attachments), så er den nemlig
tekst.
Avatar billede arne_v Ekspert
04. april 2004 - 22:43 #13
Skal jeg lave et 2 x upload eksempel med Data*Stream ?
Avatar billede tripwire Nybegynder
04. april 2004 - 22:45 #14
ja, det må du meget gerne.. det er super lærerigt det her... takker allerede
Avatar billede tripwire Nybegynder
04. april 2004 - 22:47 #15
det er bare server der skal sende til klient..
Avatar billede arne_v Ekspert
04. april 2004 - 22:52 #16
import java.io.*;
import java.net.*;

public class Server2 {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();
        DataInputStream is = new DataInputStream(s.getInputStream());
        save("C:\\z1copy.zip", is);
        save("C:\\z2copy.zip", is);
        save("C:\\z3copy.zip", is);
        is.close();
    }
    public static void save(String filename, DataInputStream is) throws Exception {
        int totsize = is.readInt();
        OutputStream os = new FileOutputStream(filename);
        byte[] b = new byte[10000];
        int n;
        int size = 0;
        while(size < totsize) {
            n = is.read(b);
            os.write(b, 0, n);
            size += n;
        }
        os.close();
    }
}
Avatar billede arne_v Ekspert
04. april 2004 - 22:53 #17
import java.io.*;
import java.net.*;

public class Client2 {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("localhost", 9999);
        DataOutputStream os = new DataOutputStream(s.getOutputStream());
        upload("C:\\z1.zip", os);
        upload("C:\\z2.zip", os);
        upload("C:\\z3.zip", os);
        os.close();
    }
    public static void upload(String filename, DataOutputStream os) throws Exception {
        int size = (int)(new File(filename)).length();
        os.writeInt(size);
        InputStream is = new FileInputStream(filename);
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            os.write(b, 0, n);
        }
        is.close();
    }
}
Avatar billede arne_v Ekspert
04. april 2004 - 22:55 #18
Den anden vej ?
Avatar billede arne_v Ekspert
04. april 2004 - 22:56 #19
import java.io.*;
import java.net.*;

public class Server2 {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();
        DataOutputStream os = new DataOutputStream(s.getOutputStream());
        download("C:\\z1.zip", os);
        download("C:\\z2.zip", os);
        download("C:\\z3.zip", os);
        os.close();
    }
    public static void download(String filename, DataOutputStream os) throws Exception {
        int size = (int)(new File(filename)).length();
        os.writeInt(size);
        InputStream is = new FileInputStream(filename);
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            os.write(b, 0, n);
        }
        is.close();
    }
}

import java.io.*;
import java.net.*;

public class Client2 {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("localhost", 9999);
        DataInputStream is = new DataInputStream(s.getInputStream());
        save("C:\\z1copy.zip", is);
        save("C:\\z2copy.zip", is);
        save("C:\\z3copy.zip", is);
        is.close();
    }
    public static void save(String filename, DataInputStream is) throws Exception {
        int totsize = is.readInt();
        OutputStream os = new FileOutputStream(filename);
        byte[] b = new byte[10000];
        int n;
        int size = 0;
        while(size < totsize) {
            n = is.read(b);
            os.write(b, 0, n);
            size += n;
        }
        os.close();
    }
}
Avatar billede arne_v Ekspert
04. april 2004 - 22:57 #20
Den sidste er ikke testet, men ...
Avatar billede arne_v Ekspert
04. april 2004 - 22:57 #21
Og et svar
Avatar billede tripwire Nybegynder
04. april 2004 - 23:00 #22
mange tak.. det var lige det jeg manglede.. nu kan jeg selv sidde og rode med at tilpasse det, men det skulle være nemt nok.. tak
Avatar billede arne_v Ekspert
04. april 2004 - 23:01 #23
Protokollen skal vel forbedres til at sende filnavn med og den slags.
Avatar billede tripwire Nybegynder
04. april 2004 - 23:04 #24
filnavn var noget jeg sendte over via min printwriter..
Avatar billede tripwire Nybegynder
04. april 2004 - 23:08 #25
wow
Exception in thread "main" java.net.SocketException: Software caused connection
abort: socket write error
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at java.io.DataOutputStream.write(DataOutputStream.java:85)
        at Server2.download(Server2.java:21)
        at Server2.main(Server2.java:11)
Tryk på en vilkårlig tast for at fortsætte . . .
Avatar billede arne_v Ekspert
04. april 2004 - 23:22 #26
Nogen specielle ændringer du har lavet ?
Avatar billede arne_v Ekspert
04. april 2004 - 23:22 #27
Prøv evt. at ændre 10000 til 1000.
Avatar billede tripwire Nybegynder
05. april 2004 - 08:53 #28
har ikke lavet nogen ændringer i koden.. prøver lige det med 1000 når jeg kommer hjem iaften..

men det super simple eksempel som du har lavet (det første), det kan jeg vel sagtens bruge sammen med bufferedreader og printwriter, hvis bare jeg laver en ekstra socket??
Avatar billede arne_v Ekspert
05. april 2004 - 09:08 #29
Der er et par forskellige muligheder:

1)  2 sockets - 1 tekst til kontrol + 1 binær til data overførsel

2)  1 socket og forsigtig skift mellem tekst og binære data
Avatar billede arne_v Ekspert
05. april 2004 - 09:21 #30
Men nu har jeg også fået en fejl.

Så jeg laver lige en forbedret version !

:-)
Avatar billede arne_v Ekspert
05. april 2004 - 09:24 #31
import java.io.*;
import java.net.*;

public class Server3 {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();
        DataOutputStream os = new DataOutputStream(s.getOutputStream());
        download("C:\\z1.zip", os);
        download("C:\\z2.zip", os);
        download("C:\\z3.zip", os);
        os.close();
    }
    public static void download(String filename, DataOutputStream os) throws Exception {
        int size = (int)(new File(filename)).length();
        os.writeInt(size);
        InputStream is = new FileInputStream(filename);
        byte[] b = new byte[10000];
        int n;
        while((n = is.read(b)) >= 0) {
            os.write(b, 0, n);
        }
        is.close();
    }
}
Avatar billede arne_v Ekspert
05. april 2004 - 09:25 #32
import java.io.*;
import java.net.*;

public class Client3 {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("localhost", 9999);
        DataInputStream is = new DataInputStream(s.getInputStream());
        save("C:\\z1copy.zip", is);
        save("C:\\z2copy.zip", is);
        save("C:\\z3copy.zip", is);
        is.close();
    }
    public static void save(String filename, DataInputStream is) throws Exception {
        int totsize = is.readInt();
        OutputStream os = new FileOutputStream(filename);
        byte[] b = new byte[10000];
        int n;
        int size = 0;
        while(size < totsize) {
            n = is.read(b, 0, Math.min(b.length, totsize - size));  // <--------
            os.write(b, 0, n);
            size += n;
        }
        os.close();
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester