Java使用Socket傳輸檔案遇到的問題

2021-09-01 21:46:49 字數 791 閱讀 1992

1.寫了乙個socket傳輸檔案的程式,發現傳輸過去檔案有問題。找了一下午終於似乎找到了原因,記錄下來警示一下:

接受檔案的一端,向本地寫檔案之前使用thread.sleep(time)休息一下就解決了問題。

個人認為可能是傳輸過程中,接收端向磁碟寫速度有點慢,被後面的覆蓋導致錯誤。

12-29:最近看了本書《不能假設在連線的一端將資料寫入輸出流和在另一端從輸入流讀入的資料間有任何的一致性。雖然傳送端都是1024bytes為單位傳送的,但是由於網速問題接收端不一定是按照1024bytes為單位接受的,可能小於1024。所以buf[0]=5這種手段是行不通的,接受方收到的buff的第乙個字元可不一定是5。

注:若以1024bytes為傳送和接受緩衝區的話。

12-29晚:我徹底知道了原因。就是網路傳輸的問題,傳送端以1024byte為單位傳送,接收端以1024byte為單位接受。但是由於網路傳輸速度的限制,傳送端傳送出去的1024byte不能同時到達接收端,而接收端使用read獨到的可能少於1024byte。下次從上次讀到的下乙個位置繼續讀,所以以1024byte陣列的開頭設為標識位的做法是行不通的,是錯誤的。解決辦法是在接收端每次read之前,thread.sleep(mileseconds);一會。這樣就有足夠的時間等待傳送端傳送的資料完全到達接受端後再接受,這樣的話buff[0]的值就可以最為標示位了。

但是還是不提倡這種設定buff[0]為表示位的做法。好的做法是,接收端收到傳送檔案的請求收,接受檔案,不考慮標識,就沒有標識位,傳送端傳送完檔案後呼叫close(),以傳送結束標識,接收端會通過read()收到-1。接收端關閉接受流。則,檔案傳輸過程結束。

使用Spring OpenFeign 傳輸檔案

完整 1 引入openfeign依賴 a模組 提供方 b 模組 呼叫方 service 層 首先在a模組中寫好了上傳檔案並儲存檔案的介面與實現,其次 b模組在開發中,需要呼叫a模組的介面 a模組介面 使用form data傳輸file檔案 b模組在使用openfeign呼叫a介面時,出現異常 fei...

socket 傳輸檔案

在兩台計算機傳輸檔案之前,必需得先有一台計算機建立套節子連線並繫結乙個固定得埠,並在這個埠偵聽另外一台計算機的連線請求。socket new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp socket.blo...

socket 傳輸檔案

在兩台計算機傳輸檔案之前,必需得先有一台計算機建立套節子連線並繫結乙個固定得埠,並在這個埠偵聽另外一台計算機的連線請求。socket new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp socket.blo...