[英]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.