簡體   English   中英

Java 通過Socket發送文件

[英]Java Send file via Socket

我正在編寫一個 class 用於通過 Sockets 在 Java 中的 Sockets 進行 2 向發送文件,這里 是 ZD3B7C913CD04EBFEC0E 在文件接收完成之前一切都很好。 不久:

  • 在 client.java 是硬編碼到 C:\Maven\README.txt 的方式
  • 首先我發送文件名
  • 然后我發送文件長度
  • 在第三步,我將文件從 FileInputStream 發送到 DataOutputStream

在客戶端:

byte[] bytes = new byte[(int)forSend.length()];
InputStream fin = new FileInputStream(forSend);
int count;
while ((count = fin.read(bytes)) > 0) {
    out.write(bytes, 0, count);
}
fin.close();
fout = new FileOutputStream(filename);
byte[] bytes = new byte[length];
System.out.println("receiving file...");
int count;
while ((count = in.read(bytes)) > 0) {
    fout.write(bytes, 0, count);
}
fout.flush();
fout.close();
  • 服務器上的文件被完全接收(相同的長度和內容)

當我試圖添加代碼以便在那之后向套接字寫入一些東西時,在啟動服務器和客戶端之后正在等待一些東西(我不知道是什么)

以前我在丟失一次 DataInputStream 讀取時遇到這種情況(從服務器發送的消息,但客戶端上沒有此消息的接收者)。 但目前我正在嘗試添加在文件傳輸完成后更改的標志,並稍后檢查它的 state。 它在服務器和客戶端上都可以工作,但是從/向 Socket 添加讀/寫會使我回到服務器和客戶端都在等待某些東西的情況。

現在怎么了?

我的朋友Denr01幫助了我,所以我的錯誤是控制文件長度,我的問題中沒有任何地方。 因此,我的“完成”確認被寫入文件。 解決問題的方法在發件人中:

int read = 0;
int block = 8192;
int count = 0;
byte[] bytes = new byte[block];
while (read != forSend.length()) {
    count = fin.read(bytes, 0, block);
    out.writeInt(count);
    out.write(bytes, 0, count);
    read += count;
    System.out.println("already sent " + read + " bytes of " + forSend.length());
}
  1. 發送方讀取字節並寫入計數
  2. 它將計數發送給接收者,因此接收者將知道在當前循環迭代中要接收多少字節
  3. 然后發送方發送字節塊並增加讀取的字節計數器
  4. 在計數器不等於文件長度時重復此操作

在發件人中:

int block = 8192;
int count = 0;
int read = 0;
byte[] bytes = new byte[block];
System.out.println("recieving file...");
while (read != length) {
    block=in.readInt();
    in.readFully(bytes, 0, block);
    fout.write(bytes, 0, block);
    read += block;
    System.out.println("already recieved " + read + " bytes of " + length);
}
  1. 使長度等於發送方塊長度的字節數組
  2. 在每次迭代中,首先讀取下一個塊長度,然后讀取這個字節數
  3. 增加接收者的計數器
  4. 在計數器不等於先前收到的文件長度時重復此操作

在這種情況下,我們可以控制每個文件讀取迭代,並且始終知道要接收多少字節,因此當接收到的所有字節文件都相同時,下一個“消息”將不會寫入文件。

暫無
暫無

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

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