2014-01-21 69 views
2

林連接了的TcpClient和的TCPListener和IM 2臺設備現在只發送一個字符串和它的所有工作:如何通過networkstream c#接收大文件?

ASCIIEncoding encoder = new ASCIIEncoding(); 
byte[] buffer = encoder.GetBytes("Hello Server!"); 
clientStream.Write(buffer, 0 , buffer.Length); 
clientStream.Flush(); 

然後

bytesRead = clientStream.Read(message, 0, 4096); 
ASCIIEncoding encoder = new ASCIIEncoding(); 
Console.WriteLine("Mensageee"+ encoder.GetString(message, 0, bytesRead)); 

但現在我需要在它發送大文件像10MB或更多,所以我應該使用這個?

string doc = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
     byte[] file = File.ReadAllBytes(doc + filedir) 
     byte[] fileBuffer = new byte[file.Length]; 
     TcpClient clientSocket = new TcpClient(ip, port); 
     NetworkStream networkStream = clientSocket.GetStream(); 
     networkStream.Write(file.ToArray(), 0, fileBuffer.GetLength(0)); 
     networkStream.Close(); 

而我應該如何收到所有這個文件,然後將它保存在某個地方? 歡迎任何幫助的感謝O/

+0

你爲什麼在'的byte []'調用'ToArray的()'?目前還不清楚你的'fileBuffer'變量是什麼...... networkStream.Write(file,0,file.Length)'有什麼問題? –

+0

你說得對,我想我可以使用networkStream.Write(file,0,file.Length),這只是我發現的一個隨機例子。問題是我如何通過聽衆接收這個大文件,以及如何獲得有關還有多少錯誤的反饋,以便我可以更新進度條? – user3120770

+0

好吧,你不知道未來會有多少數據,除非你把它放在某個地方的流中......你需要考慮你的協議。例如,您是否需要能夠在同一個連接中發送多個郵件? –

回答

7

簡短的回答是,你發送一個byte[]多次...

從本質上講,你需要用的子集,以填補一個緩衝區(「字節[]」)文件:

int count = fileIO.Read(buffer, 0, buffer.Length); 

,然後發送緩衝區在插座:

clientSocket.Send(buffer, 0, count); 

只要做到這兩個過程,直到您發送ENTI重新文件...(這將是當count <= 0)但是,服務器必須知道有多少字節要讀取...所以我們應該開始通過發送文件的長度Int64

我們有什麼到目前爲止...

using (var fileIO = File.OpenRead(@"C:\temp\fake.bin")) 
using(var clientSocket = new System.Net.Sockets.TcpClient(ip, port).GetStream()) 
{ 
    // Send Length (Int64) 
    clientSocket.Write(BitConverter.GetBytes(fileIO.Length, 0, 8)); 

    var buffer = new byte[1024 * 8]; 
    int count; 
    while ((count = fileIO.Read(buffer, 0, buffer.Length)) > 0) 
    clientSocket.Write(buffer, 0, count); 
} 

服務器端

Int64 bytesReceived = 0; 
int count; 
var buffer = new byte[1024*8]; 

// Read length - Int64 
clientStream.Read(buffer, 0, 8); 
Int64 numberOfBytes = BitConverter.ToInt64(buffer, 0); 

using(var fileIO = File.Create("@c:\some\path")) 
    while(bytesReceived < numberOfBytes && (count = clientStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
    fileIO.Write(buffer, 0, count); 
    bytesReceived += count; 
    } 
+0

瞭解邏輯,即時通訊只是在這一行中「操作不支持」clientStream.Write(BitConverter.GetBytes(clientStream.Length),0,8);「 – user3120770

+0

這將如何「clientStream.Write(BitConverter.GetBytes(clientStream.Length),0,8);」 要知道我的文件有多大,我沒有得到,這行,這將說我的文件的大小,與tmy FileIO連接? – user3120770

+0

我的錯誤,它應該是'fileIO.Length' – Andrew