socket為什麼無法傳輸大文件
『壹』 請教socket文件傳輸問題
關閉?Receive最好開辟一個線程,來不斷循環不斷偵聽每次發來的數據,你的Send傳遞的數據如果為二進制,最好分成兩次傳遞,第一次傳遞二進制數據的長度,第二次傳遞數據,Receive接收的第一次數據得到二進制數據長度後,定義位元組數組的長度,第二次向位元組數組傳遞數據!你不是關閉,你是不是將傳遞與接收寫在一起了?
『貳』 用SOCKET寫文件傳輸遇到問題
1、跟雙核沒有關系。
2、你new的沒有釋放
3、事件怎麼定義和使用的,是否是全局的?如果是要定義成靜態的。
4、懷疑你讀取文件沒有移動文件指針。
5、至於200K文件傳輸沒有問題,彈出錯誤是在處理內存時出錯。
『叄』 SOCKET 傳輸大文件應該怎麼做
昨天有去做測試,發現,並不是IO的問題造成整體的傳輸慢!還會代碼存在問題
我按照自己3的思路去完成代碼,也就是在Server端,我分了兩個線程,一個線程用於讀取文件,並將讀到的buf加入到一個動態鏈表尾部,另一個線程從此鏈表頭取數據,進行send操作,並且對send的返回值進行校驗,如果send的返回值和預期的發送位元組數不同,則採用斷點重傳的方式,繼續傳輸。在Client埠,也是用類似的服務端的機制,維護一個鏈表,進行讀取。
需要說明的是:我維護的這個鏈表是由深度的,並通過深度來調節兩個線程對鏈表的操作。
『肆』 請教關於socket傳輸大文件的思路
這要考慮到文件I/O的效率和傳輸的速率的問題。
關於I/O效率:buffer的值對I/O效率有很大影響,一般而言buffer緩沖區大小設置為1024 2048 或者4096會得到最佳速率。
關於傳輸:這個和你的帶寬和網路狀況有關了,帶寬越大,網路狀況越好自然傳輸速度就快。
至於編碼,你多線程傳輸跟單線程傳輸效率基本上差不多。跟普通文件一樣的方式傳輸就行。
如有不同意見的朋友請指教!謝謝!
『伍』 java中,利用socket傳送大文件,中途停止問題
thread裡面接收數據應該是一個循環把?
那麼就給這個循環加一個跳出條件,比如說
private boolean stop=true;
在循環當中增加
if(stop=false){
break;
}
public void setStop(boolean stop)
{
this.stop=stop;
}
然後在需要停的時候調用setStop(false)就可以了
上面純手打,代碼拼寫什麼的可能有錯大概就是這個意思
順便說一下,thread.interrupt()是用來防止sleep或者wait方法卡死的,不會讓線程終結。你要讓線程結束還是要手動讓程序跳出循環
『陸』 c語言socket文件傳輸問題
伺服器端(發送文件):首先打開文件【fopen】,用rb方式打開,既可以發送文本文件,也可以發送二進制文件,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充伺服器的地址,即填充sockaddr_in結構,然後進行綁定【bind】,設置套接字為監聽套接字【listen】,接收連接【accept】,至此伺服器阻塞,等待客戶端的連接。
客戶端(接收文件):首先打開文件【fopen】,用wb方式打開,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充客戶端的地址,即填充sockaddr_in結構,然後進行綁定【bind】,再填充伺服器的地址結構,然後調用【connect】進行連接,當連接成功後,第一階段的工作便結束了。
第二階段,發送文件。
伺服器端:使用循環while,結束條件是(!feof(fp)),fp是文件指針,feof檢測當前的文件讀取指針是否到達文件尾部,若到達了就返回真,否則返回假。然後在循環內部依次調用【fread】、【send】進行發送。這里有一個問題需要注意,調用fread的時候有兩個參數是要每次讀多少位元組和讀多少次,將第一個設置為1,將第二個設置為緩沖區的大小,用一個變數記錄實際讀到多少位元組,即【fread】的返回值,然後將其傳遞給【send】,就可以實現發送文件了,在發送完成後斷開連接【closesocket】,關閉文件【fclose】。
客戶端:使用while死循環,調用【recv】接收文件,【fwrite】寫入文件,這里也有個和上面類似的問題,就是要將recv的返回值傳遞給fwrite的第三個參數,即受到了多少位元組,就向文件中寫多少位元組。當recv返回值為0時(連接斷開時)退出循環,【closesocket】關閉套接字,調用【fclose】關閉文件。
『柒』 socket 大文件如何發送
大文件的發送可以把大文件按照二進制byte[]的方式讀取 設定一次發送的最大位元組數 然後根據最大發送位元組數分割成N個等分可能最後一個N的位元組數小於最大發送位元組數 解決方法是後面補填0就可以了因為發送時間可能會很長 因此用TCP 協議 保證傳輸的完整性 另外你可以自己編寫協議(每次發送之前做一次校驗 接收方校驗通過就通知發送方發送下一個包就可以了) 做實驗的話校驗部分就可有可無
『捌』 用java socket傳輸多文件遇到的問題
我覺得應該是你在伺服器端的接收之後存儲的緩存是不是太小了 當你的文件大於這個緩存的最大容量時 就會拋出異常 程序雖然沒有停止 但是那個監聽埠就會被關閉掉
『玖』 socket(C#)實現把文件從客戶端傳向伺服器端時,為什麼每次都只能傳2KB大小的文件啊
發送的時候要用while循環,直到整個文件傳完收的時候也是,用while循環到收完 因為發是一段一段發的,發一段,收完再發一段,再收完再發一段
『拾』 在socket 編程時如果客戶端發給伺服器端的數據太大,一次性不能傳送完,要怎麼辦
數據太大的話一般都會分包發送,TCP和UDP包都有最大的上限。如果伺服器端收不到就不會執行的話要用TCP協議。
傳輸層:
對於UDP協議來說,整個包的最大長度為65535,其中包頭長度是65535-20=65515;
對於TCP協議來說,整個包的最大長度是由最大傳輸大小(MSS,Maxitum Segment Size)決定,MSS就是TCP數據包每次能夠傳
輸的最大數據分段。為了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需
要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值
確定為這次連接的最大MSS值。
IP層:
對於IP協議來說,IP包的大小由MTU決定(IP數據包長度就是MTU-28(包頭長度)。 MTU值越大,封包就越大,理論上可增加傳送速率,但
MTU值又不能設得太大,因為封包太大,傳送時出現錯誤的機會大增。一般默認的設置,PPPoE連接的最高MTU值是1492, 而乙太網
(Ethernet)的最高MTU值則是1500,而在Internet上,默認的MTU大小是576位元組