簡體   English   中英

使用UDP傳輸文件

[英]File transfer using UDP

我編寫了一個程序來將文件從客戶端傳輸到服務器端。 程序運行沒有任何錯誤。 此外,該文件是在目標路徑上創建的。 但是當我嘗試打開文件時,gedit 崩潰了。 該程序應該傳輸音頻、視頻、文本文件。我知道不應該使用 UDP 傳輸文件,因為它可能已損壞,但我必須將其作為分配來執行。 以下代碼用於文本文件傳輸。

服務器端.java

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

public class server
{
            public static void main(String args[])throws IOException
            {

                        DatagramSocket dsoc=new DatagramSocket(8008);
                        byte b[]=new byte[787734];                
            byte c[];                   
            String pac ;
            File file = new File("/home/san_16398/ip2.java");
         FileOutputStream f = new FileOutputStream(file);


                        while(true)
                        {
                                    DatagramPacket dp=new DatagramPacket(b,b.length);
                                    dsoc.receive(dp);
                                    pac =new String(dp.getData(),0,dp.getLength());
                                  System.out.println(pac);                             

                        }

                   pac.getBytes();
                      f.write(b);
                      f.flush();
                      f.close();
            }
}

客戶端.java

import java.net.*;
import java.io.*;
public class client
{
private static final int BUFFER_SIZE = 4096;
            public static void main(String args[])throws Exception
            {         
                        byte b[]=new byte[787734];
                        FileInputStream f=new FileInputStream("/home/san_16398/ip.java");
                        DatagramSocket dsoc=new DatagramSocket(2000);
                        int i=0;
                        byte[] buffer = new byte[BUFFER_SIZE];
                        while(f.read(buffer) != -1)
                        {
                                    b[i]=(byte)f.read();
                                    i++;
                        }                     
                        f.close();
                        dsoc.send(new DatagramPacket(b,i,InetAddress.getLocalHost(),8008));
            }

}

這里:

while(f.read(buffer) != -1){
  b[i]=(byte)f.read();
  • 首先你正在讀你的緩沖區對象 - 然后永遠不要使用buffer數組
  • 然后你再次讀取一個字節
  • 然后再次讀入緩沖區

長話短說:要么使用read(buffer)要么始終使用單字節read()

除此之外:您還忘記檢查您打算讀取的文件是否適合您要傳輸到服務器的緩沖區!

最后:你還試圖同時做*太多**的事情。 相反:專注於這項工作的不同部分,例如:

  • 首先編寫讀取文件的代碼
  • 然后增強它以創建該文件的本地副本
  • 然后,當它起作用時,而不是創建本地副本,而是發送到遠程服務器。
byte b[]=new byte[787734];
// ...
while(f.read(buffer) != -1){
    b[i]=(byte)f.read();
    i++;
}
dsoc.send(new DatagramPacket(b,i,InetAddress.getLocalHost(),8008));

這完全是胡說八道。 您最多讀取 787734 個字節並將其丟棄,然后讀取一個字節(如果有),然后顯然嘗試發送大小高達 787734 的數據報,這是不可能的。 它應該是:

byte b[]=new byte[534];
// ...
int count;
while((count = f.read(b)) != -1){
    dsoc.send(new DatagramPacket(b,count,InetAddress.getLocalHost(),8008));
}

然后你必須處理重復的數據報、未收到的數據報、亂序接收的數據報,......

當您使用FileOutputStream時調用File.exists()File.createNewFile()充其量是完全浪費時間,但是當您創建FileOutputStream之后調用它們時您很可能會破壞正在寫入的文件,取決於平台。 消除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM