Avatar billede ttn- Nybegynder
14. november 2004 - 15:35 Der er 14 kommentarer og
1 løsning

fil over socket

Hejsa

Hvordan kan jeg sende en fil, lige gyldig hvilken, over en socket?
Avatar billede arne_v Ekspert
14. november 2004 - 15:40 #1
Du læser fra fil og skriver til socket !

:-)

Eksempel:

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 ttn- Nybegynder
14. november 2004 - 15:45 #2
hvordan skal den så modtages å den anden side? Altså fra serveren?
Avatar billede arne_v Ekspert
14. november 2004 - 15:56 #3
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
14. november 2004 - 15:57 #4
Der er mange forskellige mådet at gøre det på, men dette eksemepl skulle
ihvertfald kune få dig igang.
Avatar billede ttn- Nybegynder
14. november 2004 - 16:48 #5
vil prøve :)
Avatar billede ttn- Nybegynder
14. november 2004 - 17:02 #6
Hvordan kan jeg lave en protokol, så clienten kan bestemme, hvilken fil, der skal sendes og hvad den skal gemmes som?(Du kan sikkert regne ud, at jeg skal lave en FTPClient/Server :))
Avatar billede arne_v Ekspert
14. november 2004 - 17:06 #7
Jeg havde ikke lige gættet FTP. FTP er meget speciel derved at der er en control
connection, hvor kommandoer inklsive filnavne sendes, og en data connectio, hvor
selve data sendes.
Avatar billede arne_v Ekspert
14. november 2004 - 17:07 #8
Først lige et modificeret eksempel som kan sende flere filer.

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();
  }
}

og

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, 0, Math.min(b.length, totsize - size));
        os.write(b, 0, n);
        size += n;
      }
      os.close();
  }
}
Avatar billede arne_v Ekspert
14. november 2004 - 17:09 #9
Ovenstående bruger en protokol med:

1 int - antal bytes i fil indhold
X bytes - fil indhold

Den kunne nemt udvides til:

1 short - antal bytes i filnavn
X bytes - filnavn
1 int - antal bytes i fil indhold
Y bytes - fil indhold

så så igen kan udvides til at have forskellige kommandoer.
Avatar billede ttn- Nybegynder
14. november 2004 - 17:10 #10
Tak!

Smid et svar, så kigger jeg på det:) Der er nok at kaste sig ud i, kan jeg se :)
Avatar billede arne_v Ekspert
14. november 2004 - 17:11 #11
svar
Avatar billede ttn- Nybegynder
14. november 2004 - 18:08 #12
Hvordan kan jeg sende et filnavn fra clienten til serveren, som dokumentet så skal gemmes under?
Avatar billede arne_v Ekspert
14. november 2004 - 18:31 #13
Som jeg skrev 17:09:19 så sende du bare filnavnet først.

Det er lidt nemmere hvis du skifter fra OutputStream-InputStream til
DataOutputStream-DataInputStream.
Avatar billede arne_v Ekspert
14. november 2004 - 18:32 #14
dos.writeUTF(filnavn);

og

String filnavn = dis.readUTF();
Avatar billede ttn- Nybegynder
14. november 2004 - 18:34 #15
Jeg tjekker det lige :)!

Tak for hjælpen! :)
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