Java fájl transzfer

Java fájl transzfer
2004-08-02T14:44:21+02:00
2005-12-05T01:18:29+01:00
2022-10-28T04:25:44+02:00
ZsZso
Üdv,

A kérdés a következő ... mi a leghatékonyabb módja egy nagy fájl átvitelének JAVA-ban ? A Streammel, úgy hogy buffereltem csak 100 KB/sec -es sebességre voltam képes. Hallottam, és próbáltam is már a FileChannelt, de még SocketChannel-t sose sikerült csinálonom (jó, sikerült, csak nem működött :). Az egyik oldalt fájlból kellene beolvasni, és azt átküldeni egy socketen. A másik oldalt ezt fogadnám, és írnám ki gyorsan fájlba.

Most fájlba, be -ki DataStream -mel megy, socketbe meg BuffereltStream -mel. (max 100-120 KB/sec)

Továbbá ... mennyire kell ip forwarding ahoz hogy kliens, vagy szerver működjön, ha véletlen router, firewall mögött van ?

Köszi előre is a segítséget !
Mutasd a teljes hozzászólást!


import java.io.*; import java.net.*; import java.util.*; import java.util.zip.*; public class FTR { public static void main(String[] args) { try { FTR srv = new FTR(); String host = "SRV"; int port = 5000; String filename = "prb.txt"; if (args.length > 0) { host = args[0]; } if (args.length > 1) { port = Integer.parseInt(args[1]); } if (args.length > 2) { filename = args[2]; } if (host.toUpperCase().equals("SRV")) { System.out.println("Szerver indul a "+port+" porton."); server(port); System.out.println("Szerver leallt."); return; } File f = new File(filename); if ((f == null)||(! f.exists())||(! f.isFile())) { System.out.println("Nincs ilyen file: "+filename); return; } System.out.println("Kapcsolodas a "+host+" gepen a "+port+" portra."); Socket s = new Socket(host, port); System.out.println(f.getName()+" file feltoltese, a merete "+(f.length()/1024)+"KB."); write(s, new FileInputStream(f)); } catch (Exception e) { e.printStackTrace(); } }//main vége public static void server(int port) { try { boolean canrun = true; ServerSocket ss = new ServerSocket(port); Socket s = null; while (canrun) { try { s = ss.accept(); } catch(Exception ex) { canrun = false; s = null; } read(s); if (System.in.available() > 0) { canrun = false; } } if (ss != null) ss.close(); } catch (Exception e) { e.printStackTrace(); } }//server vége public static void read(Socket s) { try { if (s == null) return; System.out.print("Letoltes "); InputStream is = new BufferedInputStream(new GZIPInputStream(s.getInputStream()), 65535); byte[] b = new byte[4096]; long time1, time2, size = 0; int cnt; time1 = System.currentTimeMillis(); while((cnt = is.read(b)) > 0) { size += cnt; } time2 = System.currentTimeMillis(); is.close(); s.close(); time1 = (time2-time1); if (time1 != 0) { time2 = (size/time1); System.out.println("sebesseg: "+time2+" KB/S merete: "+(size/1024)+"KB ideje: "+(time1/1000)+"Sec."); } else { System.out.println("sebesseg: VEGTELEN merete: "+size+"byte ideje: NULLA"); } } catch (Exception e) { e.printStackTrace(); } }//read vége public static void write(Socket s, InputStream is) { try { if ((s == null)||(is == null)) { return; } System.out.print("Feltoltes "); OutputStream os = new GZIPOutputStream(s.getOutputStream()); is = new BufferedInputStream(is, 65535); byte[] b = new byte[4096]; long time1, time2, size = 0; int cnt; time1 = System.currentTimeMillis(); while((cnt = is.read(b)) > 0) { os.write(b, 0, cnt); size += cnt; } time2 = System.currentTimeMillis(); os.flush(); os.close(); is.close(); s.close(); time1 = (time2-time1); if (time1 != 0) { time2 = (size/time1); System.out.println("sebesseg: "+time2+" KB/S merete: "+(size/1024)+"KB ideje: "+(time1/1000)+"Sec."); } else { System.out.println("sebesseg: VEGTELEN merete: "+size+"byte ideje: NULLA"); } } catch (Exception e) { e.printStackTrace(); } }//write vége }//FTR vége

A szervernél igaz nincs file kiiratás, de azt te is beillesztheted. Nálam 1MB/S volt az átlagsebesség lokálhoszton keresztül. Érdekes módon kisebb fájloknál kisebb volt a sebesség. Úgy tűnik, mintha az oprendszer file bufferelése is sokat dob a sebességen. Ha többször küldöd ugyanazt a kis fájlt, akkor előfodulhat, hogy a memóriából fogja az oprendszer nyomatni, ezért volt nekem 0 miliseces átviteli időm néhányszor (a java betöltése is sokat kivesz az OP bufferterületéből, de ha parancssori kapcsolók helyett némi ablakos felülettel, vagy ilyesmivel kombinálod, akkor nagyobb fájlok többszöri átküldésekor is sebességnövekedés tapasztalható esetleg).
A szerver normál lelövése: billentyűzetről bármit beírsz és enterezed, majd még egy feltöltést csinálsz (kis file is megteszi).
Mutasd a teljes hozzászólást!

  • Javaslom a tömörítés (GZIP vagy Zip) használatát.
    java.util.zip csomag

    ez a 120KB/S az interneten keresztül, vagy helyi LAN-on megy. Nekem Csillóm van, de még a nemrégi gyorsítás óta sem megy 100KB/S-nál gyorsabban semmi (nem java).
    Mutasd a teljes hozzászólást!
  • saját gépre megy 100-120 kilós sebességgel. 127.0.0.1 -es IPre küldöm a cuccost. Sajna ineten keresztül még nem sikerült, mert a segítségnek routerje volt, és IP forwardingolni nem tudott ... de nálad se szerver, se kliens nem ment. Azaz ... csatlakozni tudott hozzám, csak adatot nem tudott küldeni.

    Csak egy fileChannel -es csodával fájlt kopiltam, aztán láttam, hogy a 3MBos fájl egy pill alatt átkerült máshova. Így meg kell neki fél perc.

    De ezek szerint mindenki ezt használja ... na azért még várok, hátha ...

    (de azért köszi, ha nem jön válasz úgyis te leszel a megfejtő :)
    Mutasd a teljes hozzászólást!


  • import java.io.*; import java.net.*; import java.util.*; import java.util.zip.*; public class FTR { public static void main(String[] args) { try { FTR srv = new FTR(); String host = "SRV"; int port = 5000; String filename = "prb.txt"; if (args.length > 0) { host = args[0]; } if (args.length > 1) { port = Integer.parseInt(args[1]); } if (args.length > 2) { filename = args[2]; } if (host.toUpperCase().equals("SRV")) { System.out.println("Szerver indul a "+port+" porton."); server(port); System.out.println("Szerver leallt."); return; } File f = new File(filename); if ((f == null)||(! f.exists())||(! f.isFile())) { System.out.println("Nincs ilyen file: "+filename); return; } System.out.println("Kapcsolodas a "+host+" gepen a "+port+" portra."); Socket s = new Socket(host, port); System.out.println(f.getName()+" file feltoltese, a merete "+(f.length()/1024)+"KB."); write(s, new FileInputStream(f)); } catch (Exception e) { e.printStackTrace(); } }//main vége public static void server(int port) { try { boolean canrun = true; ServerSocket ss = new ServerSocket(port); Socket s = null; while (canrun) { try { s = ss.accept(); } catch(Exception ex) { canrun = false; s = null; } read(s); if (System.in.available() > 0) { canrun = false; } } if (ss != null) ss.close(); } catch (Exception e) { e.printStackTrace(); } }//server vége public static void read(Socket s) { try { if (s == null) return; System.out.print("Letoltes "); InputStream is = new BufferedInputStream(new GZIPInputStream(s.getInputStream()), 65535); byte[] b = new byte[4096]; long time1, time2, size = 0; int cnt; time1 = System.currentTimeMillis(); while((cnt = is.read(b)) > 0) { size += cnt; } time2 = System.currentTimeMillis(); is.close(); s.close(); time1 = (time2-time1); if (time1 != 0) { time2 = (size/time1); System.out.println("sebesseg: "+time2+" KB/S merete: "+(size/1024)+"KB ideje: "+(time1/1000)+"Sec."); } else { System.out.println("sebesseg: VEGTELEN merete: "+size+"byte ideje: NULLA"); } } catch (Exception e) { e.printStackTrace(); } }//read vége public static void write(Socket s, InputStream is) { try { if ((s == null)||(is == null)) { return; } System.out.print("Feltoltes "); OutputStream os = new GZIPOutputStream(s.getOutputStream()); is = new BufferedInputStream(is, 65535); byte[] b = new byte[4096]; long time1, time2, size = 0; int cnt; time1 = System.currentTimeMillis(); while((cnt = is.read(b)) > 0) { os.write(b, 0, cnt); size += cnt; } time2 = System.currentTimeMillis(); os.flush(); os.close(); is.close(); s.close(); time1 = (time2-time1); if (time1 != 0) { time2 = (size/time1); System.out.println("sebesseg: "+time2+" KB/S merete: "+(size/1024)+"KB ideje: "+(time1/1000)+"Sec."); } else { System.out.println("sebesseg: VEGTELEN merete: "+size+"byte ideje: NULLA"); } } catch (Exception e) { e.printStackTrace(); } }//write vége }//FTR vége

    A szervernél igaz nincs file kiiratás, de azt te is beillesztheted. Nálam 1MB/S volt az átlagsebesség lokálhoszton keresztül. Érdekes módon kisebb fájloknál kisebb volt a sebesség. Úgy tűnik, mintha az oprendszer file bufferelése is sokat dob a sebességen. Ha többször küldöd ugyanazt a kis fájlt, akkor előfodulhat, hogy a memóriából fogja az oprendszer nyomatni, ezért volt nekem 0 miliseces átviteli időm néhányszor (a java betöltése is sokat kivesz az OP bufferterületéből, de ha parancssori kapcsolók helyett némi ablakos felülettel, vagy ilyesmivel kombinálod, akkor nagyobb fájlok többszöri átküldésekor is sebességnövekedés tapasztalható esetleg).
    A szerver normál lelövése: billentyűzetről bármit beírsz és enterezed, majd még egy feltöltést csinálsz (kis file is megteszi).
    Mutasd a teljes hozzászólást!
  • a kiiráshoz mit és hova kell berakni??

    Köszi!!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd