Hallo,
ich habe es mir zur Aufgabe gemacht, eine Applikation zu schreiben, die im Netzwerk zu einem Rechner Datein in unterschiedlichster Größe schicken kann. D.h. auch Dateien in der Größenordnung von 2GB oder mehr.
Die Client-Seite:
1) Client schickt Anfrage
2) Client schickt Dateinamen, der verschickt werden soll
3) Client bekommt Bestätigung vom Server
4) Client schickt die Datei los
(Problem!!!!)
Die Server-Seite:
1) Server erwidert Anfrage
2) Server bekommt Dateinamen und sucht Speicherort aus
3) Server schickt Bestätigung
4) Server erhält datei
(Problem!!!!)
damit das ewas klarer wird, stelle ich den CodeAbschnitt mal rein:
Client:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| byte[] filenameByte = Encoding.UTF8.GetBytes(filename); server.Send(filenameByte); byte[] operationByte = new byte[2]; server.Receive(operationByte); int operation = BitConverter.ToInt16(operationByte, 0); Console.WriteLine("Received operation: --{0}--", operation.ToString()); if (operation == 1) { Console.WriteLine("Operation succeeded: {0}\r\nFilePath: {1}", operation.ToString(), onlypath + filename); FileStream fs = new FileStream(onlypath + filename, FileMode.Open); byte[] fileSendByte = new byte[length]; while (fs.Read(fileSendByte, 0, length) == 0) { Console.WriteLine("Send: {0}", Convert.ToString(fileSendByte.Length)); server.Send(fileSendByte); } fs.Close(); server.Close(); } else if (operation == 0) { Console.WriteLine(operation + "\r\n"); server.Close(); } |
Server:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| byte[] filenameByte = new byte[1024]; clientSocket.Receive(filenameByte); string filename = Encoding.ASCII.GetString(filenameByte); Console.WriteLine("---" + filename + "---"); string filepath = Model.LFS.saveFile(filename); if (filepath != "") { filepath.Replace('\\', '/'); Console.WriteLine(filepath); byte[] operationByte = BitConverter.GetBytes(1); clientSocket.Send(operationByte); byte[] fileReceiveByte = new byte[length]; FileStream fs = new FileStream(filepath, FileMode.Append, FileAccess.ReadWrite); while (true) { clientSocket.Receive(fileReceiveByte); Console.WriteLine("Receive: {0}", Convert.ToString(fileReceiveByte.Length)); fs.Write(fileReceiveByte, 0, length); if (fileReceiveByte.Length == 0) { break; } } fs.Close(); } else { Console.WriteLine("Canceled"); byte[] operationByte = BitConverter.GetBytes(0); clientSocket.Send(operationByte); } clientSocket.Shutdown(SocketShutdown.Both); |
Das Programm schmiert immer ab, sobald es die Datei empfangen soll!
Wieso?
Ist der Ansatz mit FileStream behaupt richtig oder gibt es eine bessere Variante?
Da Dateien in größe von 2 GB den kompletten Speicher belegen würden, habe ich versucht die Datei Stückweise in 50MB Abschnitten zu verschicken.
C#-Quelltext
1:
| internal int length = 1024 * 50000; |
Ich hoffe es kann mir jemand weiterhelfen.
Danke schonmal
Grüße