[英]File transfer through Socket in java
我正在制作一個網絡文件傳輸系統,用於在Java中通過網絡傳輸任何類型的文件。 大小也可以是任何種類。 因此,我已將UTF-8協議用於該任務。
我提供的是我編寫的代碼,但是問題是文件有時按原樣傳輸,完全沒有問題。 但是有時在接收端只是跳過了幾kb的數據,實際上限制了mp3 / video / image文件的正確打開。 我認為問題出在BUFFER。 我沒有創建任何緩沖區,目前,我認為這可能對我有用。
如果有人可以提供有關此問題的任何幫助,以使文件完全傳輸,我將不勝感激。
客戶端:--- >>文件發送方
Socket clientsocket = new Socket(host,6789); // host contains the ip address of the remote server
DataOutputStream outtoserver = new DataOutputStream(clientsocket.getOutputStream());
try
{
int r=0;
FileInputStream fromFile1 = new FileInputStream(path); // "path" is the of the file being sent.
while(r!=-1)
{
r = fromFile1.read();
outtoserver.writeUTF(r+"");
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
clientsocket.close();
服務器端:--- >>文件接收器
ServerSocket welcome = new ServerSocket(6789);
Socket conn = welcome.accept();
try
{
String r1 = new String();
int r=0;
FileOutputStream toFile1 = new FileOutputStream(path); // "path" is the of the file being received.
BufferedOutputStream toFile= new BufferedOutputStream(toFile1);
DataInputStream recv = new DataInputStream(conn.getInputStream());
while(r!=-1)
{
r1 = recv.readUTF();
r = Integer.parseInt(r1);
toFile.write(r);
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
我不明白您為什么將二進制數據編碼為文本。
普通套接字可以發送和接收字節流,而不會出現任何問題。 因此,只需使用FileInputStream將文件讀取為字節,然后將字節原樣寫入套接字即可。
(記錄下來,您可能正在為輸入文件的每個字節發送3到5個字節。並且您正在以一種類型讀取一個字節的輸入文件而沒有任何緩沖。這些錯誤以及您所犯的其他錯誤很可能會對文件傳輸速度有重大影響。獲得性能的方法是使用至少1K字節的緩沖區大小簡單地讀取和寫入字節數組。)
我不確定,但是我懷疑丟失某些數據的原因是,在關閉發送端的套接字之前,您沒有刷新或關閉outtoserver
。
跟進
我還注意到您沒有在接收器端刷新/關閉toFile
,這可能會導致您在文件末尾丟失數據。
我看到的第一個問題是您正在使用DataInputStream
和DataOutputStream
。 這些用於讀取/寫入原始Java類型( int
, long
等),而對於二進制數據則不需要它們。
另一個問題是您沒有刷新文件輸出流-這可能會導致丟失字節。
顯式刷新可能有助於解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.