2011-08-12 82 views
1

我試圖從客戶端發送文件到服務器,所以我加載文件在客戶端的一個字節數組,並將其發送到服務器槽發送()的方法,但所接收到的陣列是不同的,比發送的陣列更大,不知是否它是一個協議的問題(但是我使用TCP協議至極保證錯誤檢測):數據收到不同於數據發送槽通過尖銳的插座

客戶機代碼:

IPAddress ipAddress = new IPAddress(ip); 
IPEndPoint ipEnd = new IPEndPoint(ipAddress, 5656); 
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

FileStream fl = File.Open("pos.xls",FileMode.Open); 
byte[] fileData = ReadFully(fl); 
fl.Close(); 

byte[] clientData = new byte[ fileData.Length]; 
fileData.CopyTo(clientData,0); 

curMsg = "Connection to server ..."; 
clientSock.Connect(ipEnd); 

curMsg = "File sending..."; 
clientSock.Send(clientData); 

curMsg = "Disconnecting..."; 
clientSock.Close(); 
curMsg = "File transferred."; 

服務器代碼:

curMsg = "Starting..."; 
sock.Listen(100); 

curMsg = "Running and waiting to receive file."; 
byte[] clientData = new byte[1024 * 5000]; 
while (true) 
{ 
    Socket clientSock = sock.Accept(); 

    clientData = new byte[1024 * 5000]; 

    int receivedBytesLen = clientSock.Receive(clientData); 
    curMsg = "Receiving data..."; 

    FileStream fz = writeFully(clientData); 
    fz.Close(); 
    curMsg = "Saving file..."; 

感謝你的幫助

+0

您能否顯示發送和接收到的不同數據 – skyfoot

+0

您是否嘗試發送一小塊已知字節(例如,新字節[] {1,2,3,4,5,6}或其他),然後進行比較另一端是什麼?它可能會使你指向正確的方向;例如收到的尺寸是否更大?如果是這樣,它與大文件一樣大嗎?你發送的模式是否出現在輸出數據的某處?等 – shelleybutterfly

+0

我想發送一個Excel文件(1.65 MB),我收到一個5.12 MB的文件,我敢肯定,當我發送槽網絡時發生字節數組的問題,因爲我檢查發送之前的字節數組的大小和它是好的,並且在發送到服務器之後,它也改變了 –

回答

1

你有定義clientData = new byte[1024 * 5000]; - 你那麼就不要使用receivedBytesLen。我不記得Receive超載是否會讀一樣,因爲它可以直到EOF,或簡稱爲「部分或EOF」(後者是Stream.Read行爲),但你必須驗證和使用receivedBytesLen

IMO,固定緩衝區的方法本質上是有缺陷的,因爲它不能很好地處理超大的輸入。我個人會在這裏使用NetworkStream;那麼你的整個代碼變爲:

using(var fz = File.Create(path)) { 
    networkStream.CopyTo(fz); 
} 

這裏的另一個常見的方法是發送預期大小作爲前綴的數據;這樣你可以驗證你有你需要的數據。我個人不會使用此信息在內存中創建一個正確大小的緩衝區,但仍然不允許史詩大小的文件(然而,Stream,但)。

+0

謝謝你,你的答案几乎奏效,只有copyto似乎不在緊湊框架中存在,所以我認爲它會工作,如果我只是寫我自己的方法,這不是很複雜,謝謝 –

+0

@Tarik - 在那的情況下,用一個小緩衝區循環進入你從'Read(...)'得到一些<= 0 –

+0

是的,事實上,它終於奏效了,通過編寫類似於CopyTo()的方法,再次感謝你 –