Cần trợ giúp việc chuyển file không chờ upload xong qua Internet

Đây là một topic dông dài, nói dài nói dở và sờ-tíu-pịt, khẳng định ngay luôn là như vậy.

Như các bạn biết, ai đã dùng máy tính giai đoạn trước 2012 thì gần như đã từng dùng đến các phần mềm như Skype, Yahoo! Messenger hoặc một công cụ chat nào đó có chức năng gửi file. Phải nói rằng ngày đó Internet chậm hơn bây giờ nhiều nhưng gửi file là cái gì đó… huy hoàng.

Tại vì sao ngày đó gửi file là… huy hoàng? Tại vì ngày nay những công cụ đó chết ráo trọi, muốn xài cho việc gửi file cũng không thể được.

Huy hoàng bởi vì khi bạn gửi file một phát là bên kia thấy thanh trạng thái được bao nhiêu phần trăm. Khi thấy đầy thanh ttrạng thái là click mở file. Bạn không phải download gì về nữa, phần mềm đã lưu tạm đâu đó trên máy. Như vậy, khá giống với việc “copy trực tiếp qua mạng” :smiley:

Sau này, khi Internet đã nhanh hơn, và có cả cloud các kiểu con đà điểu nhưng mấy tháng gần đây Thin lại khóc thét với việc gửi file vì phải upload lên để bên kia tải về, chưa upload xong thì bên kia tải bằng… chờ đợi.

Lý do: tui phải upload lên cloud hoặc server, và nó hoàn tất thì bạn tui mới có thể bắt đầu tải file về sử dụng => mất gấp đôi thời gian so với kiểu gửi file huy hoàng trước đây.

Trong khi đó, hàng ngày số lượng file cần chuyển qua lại giữa tui và bạn khá lớn, số file lượng lớn, và có khi kích thước file cũng huge (từ 4GB đến 80GB đi - về 3-4 lượt/ ngày). Vì nằm trong tỉnh nên có lúc tui đành gỡ ổ cứng trong máy ra, chạy 23km mang ổ cứng và mang ổ cứng nó về còn nhanh hơn gửi qua Internet.

Hai thằng cảm thấy buồn bực quá, tìm mãi cũng không ra phần mềm nào có thể gửi trực tiếp file qua cho thằng bạn như kiểu ngày xưa mà hỗ trợ file khủng, nhất là nó xài macOS, tui lại xài Linux thì càng hiếm phần mềm.

Tui và nó cũng đã nghĩ đến giải pháp là dùng giao thức BitTorrent và dùng trình tải Torrent nào đó để gửi file cho nhau. Nhưng thế quái nào đó việc seed và tải cọc cạch mãi mà vẫn chưa được, rồi còn phải port forwarding các kiểu trong khi 2 thằng đầu có “cục router” xài IPv6, máy tính mặc định địa chỉ IPv6, kiến thức mạng mẽo mở port và mật khẩu router quên hết ráo nên cũng hoay hoay cả tuần mà không ăn thua.

Nói chung, tthử các phương án thì đều thấy quá lằng nhằng, cài cắm phức tạp nhưng đều không đạt được điều mong muốn dù mạng 2 bên gói cước tốc độ không thật cao nhưng ổn định, không bị rớt mạng.

Giờ đây, nhờ anh em cao thủ võ lâm cùng ra tay trợ giúp các cách nếu có phần mềm dạng miễn phí/ nguồn mở càng tốt để gửi file qua mạng giữa 2 máy tính macOS và LinuxMint (có thể có qua trung gian để không phải mở port, né được tường lửa bởi phần mềm dùng port mặc định mở, nhưng không đợi upload hoàn thành), nếu phần mềm này chạy được trên 2 máy Windows cũng OK vì có thể chạy máy ảo để dùng tạm.

Chân thành cám ơn mọi người!

P/S: đến giờ phút này tui hiều vì sao ông Linus Torvalds nói rằng ổng không dùng Debian vì cà đặt khó không hẳn là câu nói đùa mà một người có thể siêu sao về cái này, nhưng cái khác (khá tương tự) họ cũng chưa chắc trừ khi mất nhiều nỗ lực một cách vô lý.

First, Linux is like Windows, evolving from version to version, becoming more complicated and larger than the old ones with each new version. Linus Torvalds wrote Linux based on his AT&T UNIX knowledge. He did this because he didn’t have the money for a UNIX license. I think it’s a coincidence that Linus said he wouldn’t use Debian, because Debian, or whatever Linux kernel, is definitely different from his original Linux—for example, with new features like image processing, sound, etc.

And yes, I understand your problems with transferring large files. In the past we used to only have small data files. Now we have big image or audio files alongside them, which are usually huge. Google recognized the problem and invented WEBP/WEBM, which is even more compressed than JPEG/MP4, but the files are still large.

I’m not familiar with BitTorrent and its functionality (or implementation). However, the internet is based on TCP or UDP, and the maximum data packet size is about 64 kBytes or 512 kBit, no more. Even the internet has fiber optic cables capable of 100 Gbps. To solve your problem, you’ll need to create a C/S app yourself. A JAVA example using SocketChannel might give you an idea. However, you and your friends will need to set up “port forwarding” to perform the transfer over the internet. How? Click HERE or HERE.

Receiver (IP and port from Port Forwarding):

      SocketChannel soc = null;
      try {
        soc = SocketChannel.open(new InetSocketAddress(host, port));
        soc.socket().setReceiveBufferSize(65536); // 64KB
        soc.socket().setTcpNoDelay(true);
        ByteArrayOutputStream bao = new ByteArrayOutputStream(65536);
        ByteBuffer bbuf = ByteBuffer.allocateDirect(65536);
        // read filename
        int p = soc.read(bbuf);
        while (p <= 0) imeUnit.MICROSECONDS.sleep(100);
        byte[] buf = new byte[p];
        ((ByteBuffer)bbuf.flip()).get(buf, 0, p);
        //
        String fName = new String(buf);
        System.out.println("Save as "+fName);
        System.out.println("Reading "+fileName+" from Server");
         while ((p = soc.read(bbuf)) > 0) {
          buf = new byte[p];
          ((ByteBuffer)bbuf.flip()).get(buf, 0, p);
          bao.write(buf, 0, p);
          bbuf.clear();      
        }
        bao.flush();
        fout = new FileOutputStream(fName, false);
        fout.write(bao.toByteArray());
        fout.flush();
        fout.close();
        bao.close();
        //
      } catch (Exception ex) {
        System.out.println("Error:\n"+ex.toString());        
      }
      if (soc != null) try {
        soc.close();
      } catch (Exception ex) { }

Sender (IP and port from Port Forwarding)::

      SocketChannel soc = null;
      try {
        soc = SocketChannel.open(new InetSocketAddress(host, port));
        soc.socket().setSendBufferSize(65536);
        soc.socket().setTcpNoDelay(true);
        //
        ByteArrayOutputStream bao = new ByteArrayOutputStream(65536);
        ByteBuffer bbuf = ByteBuffer.allocateDirect(65536);
        // tell receiver the filenam
        byte[] buf = fileName.getBytes();
        socket.write(ByteBuffer.wrap(buf, 0, buf.length));
        //
        System.out.println("send file: "+fileName);
        File file = new File(fileName);
        if (!file.exists()) {
          System.out.println(fileName+" does not exist.");
          System.exit(0);
        }
        bao.write(Files.readAllBytes(file.toPath()));
        buf = bao.toByteArray();
        int n = 0, l = 65536, max = buf.length;
        while (n < max) { // Streaming         
          if ((n+65536) > max) l = max - n;
          socket.write(ByteBuffer.wrap(buf, n, l));
          TimeUnit.MILLISECONDS.sleep(10);
          if (l < 65536) break;
          n += l;
        }
      } catch (Exception ex) {
        System.out.println("Error:\n"+ex.toString());        
      }
      if (soc != null) try {
        soc.close();
      } catch (Exception ex) { }
1 Like

Thử xem perplexity trả lời câu hỏi lôi thôi của superthin ra sao. Đây là kết quả:

Dưới đây là tóm tắt các giải pháp gửi file trực tiếp giữa Linux và macOS cho file lớn (4GB đến 80GB) mà không cần cloud, open port phức tạp, ưu tiên miễn phí, mã nguồn mở và P2P:

1. LocalSend

  • Gửi file trực tiếp qua LAN hoặc relay công khai, mã hóa end-to-end.
  • Native trên Linux (AppImage/Flatpak), macOS, Windows, Android, iOS.
  • Tốc độ cao, lên đến 100MB/s trên LAN.
  • Dùng GUI thân thiện, dễ cài đặt, không cần cấu hình mạng phức tạp.
  • Hạn chế: tốt nhất khi cùng mạng, không hỗ trợ resume nếu gián đoạn.

2. Croc

  • Công cụ dòng lệnh, mã nguồn mở, an toàn với mã hóa PAKE.
  • Chạy trên Linux, macOS, Windows, không cần open port.
  • Hỗ trợ file lên trăm GB, tự động nén tăng tốc.
  • Giao diện CLI, tạo mã chia sẻ để nhận file.
  • Hạn chế: không có GUI sẵn, phụ thuộc relay có thể chậm.

3. Transmitic

  • Phần mềm GUI P2P, mã nguồn mở, hỗ trợ NAT traversal.
  • Hỗ trợ gửi file lớn, mã hóa end-to-end, resume tự động.
  • Tương thích Linux (AppImage), macOS, Windows.
  • Dùng quét mã QR hoặc ID kết nối trực tiếp.
  • Hạn chế: vẫn đang phát triển, không hỗ trợ gửi folder trực tiếp (cần zip).

So Sánh Nhanh

Công Cụ Giao Diện File Lớn 80GB+ Không Open Port Mã Nguồn Mở Tốc Độ Ước Tính Ưu Tiên Sử Dụng
LocalSend GUI Có (NAT traversal) Cao trên LAN Gửi nhanh trong cùng mạng
Croc CLI Có (relay tự động) Nhanh, nén tự động Gửi file qua mạng xa, script
Transmitic GUI Có (P2P trực tiếp) Cao, resume tự động Gửi file dễ dùng, mã hóa mạnh

Lời Khuyên

  • Test trước trên LAN hoặc qua VPN (như WireGuard) để tối ưu tốc độ.
  • Nén file trước để giảm băng thông, tăng tốc chuyển.
  • Nếu cần giao diện dễ dùng, LocalSend là lựa chọn tốt nhất để bắt đầu.
  • Croc phù hợp người quen CLI và cần truyền file qua mạng khác vùng.
  • Transmitic phù hợp khi cần GUI và khả năng phục hồi transfers.
1 Like

@superthin said:

Vì nằm trong tỉnh nên có lúc tui đành gỡ ổ cứng trong máy ra, chạy 23km mang ổ cứng và mang ổ cứng nó về còn nhanh hơn gửi qua Internet.

23 km is quite a long distance, and I doubt there’s a LAN that large except through a private WAN (Wide Area Network). If I understand @superthin correctly, he took his hard drive to his friends’ house and created a local copy. So he doesn’t have a WAN other than the public WAN, which is called the internet.

I’m not familiar with the tools you mentioned, but as you suggested,

Test the LAN router with a VPN (e.g., WireGuard) and perform the file transfer.

So these tools only work with the local network. That means you connect your computer to your friend’s router, then you can transfer the files. It’s the same as taking your computer to his friend’s house, connecting it, and performing the copy using the available operating system command (e.g., the SCP command). MacOS is based on BSD UNIX and also has the same SCP command. So why so much effort with third-party tools?

1 Like

We have no leased-line cable Internet, no LAN network from my house to my friend’s house. We use Internet for family package from ISP in Vietnam: VNPT, Viettel, FPT. I can use nc (Netcat) to transfer files but my friend cannot because he is a graphic designer, video editor not a… nerd/ hacker :smiley: so it’s a clumsy situation. Maximum upload speed 220Mbps.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?