Jeg har lavet et system til at overfører filer over LAN, og enda overfører mere end én på samme tid. Mit problem er, at den blander ting sammen når jeg modtager dataerne, med mindre jeg sætter sleep ind hvor den sender. Og derved går det MEGET MEGET langsomt med at overfører.. ville hører om der var nogen der lige ville se min function igennem, det skulle været ret simpelt.
while (true) { try { //Loop for every user for (int i = 0; i < UserInfoTable.Count; i++) { CurrentClient = (TcpClient)UserInfoTable.GetItemAt(1, i); SReader = new StreamReader(CurrentClient.GetStream());
//Use ParceCmd to check if the data contains a command //and then sort out the arguments if (funcs.ParseCmd(stringData, ref RefCmd, ref RefArg)) { String[] Split = RefArg.Split(CMDChar.ToCharArray()); IP = ((IPEndPoint)CurrentClient.Client.RemoteEndPoint).Address.ToString();
switch (RefCmd) { //Someone asks for a file, begin sending case "downloadfile": ThreadPool.InsertWorkItem("SendFile", new SendFileDelegate(AddFileToUploadList), new Object[3] { Split[0], Split[1], CurrentClient }, false); break;
//Someone is sending me a file piece case "sendingfile": int ID = Convert.ToInt32(Split[0]); //Download ID int FileSize = Convert.ToInt32(Split[1]); //Total size of file string Data = Split[2]; //File data in string format
if (DownloadTable.Contains(0, ID)) { int col; int row; //Find DL ID, and get the path of the file to write DownloadTable.IndexOf(ID, out col, out row); string fPath = DownloadTable.GetItemAt(1, row).ToString();
if (!File.Exists(fPath)) { //File do not exist (first packet), then create FileStream file1 = new FileStream(fPath, FileMode.Create, FileAccess.Write); StreamWriter sr1 = new StreamWriter(file1); sr1.Write(Data); sr1.Close(); file1.Close(); } else { //File exists, append incomming data FileStream file2 = new FileStream(fPath, FileMode.Append, FileAccess.Write); StreamWriter sr2 = new StreamWriter(file2); sr2.Write(Data); sr2.Close(); file2.Close(); } }
break;
case "endsendfile": MessageBox.Show("Download complete", "file complete"); break; } } else MessageBox.Show(stringData, "No command!"); } else Thread.Sleep(50); } Thread.Sleep(50); } catch (Exception ex) { if (Debug) MessageBox.Show(ex.Message, "TCPListenThread"); } } }
Jeg ville bruge StreamReader ReadLine til at læse fil ind med.
Har du overvejet en tråd per client så du slipper for det loop ?
Hvad mener du med "den blander ting sammen når jeg modtager dataerne" ?
Jeg kan ikke få client og server protokollen til at hænge sammen. Client sender N linier med data og en STOP marker. Server forventer 1 linie med et TAG og hele data plus en STOP marker.
Personligt ville jeg nu benytte en seperat port til komandoer og naturligvis bruge en StreamReader/Writer til det... men til selve filen vil jeg nu bruge en BinaryReader/Writer og sende det som rå data...
Yderligere ville jeg dele en fil op i "pakker" ganske som protokolstakken gør det, men igen vil jeg også selv dele det op, udstyrer pakker osv med en form for header...
Den sidste del er der en række løsninger på, men det kan anvedes til at sende flere filer samtidigt over samme socket (dermed samme port)... andre opretter jo en port/socket til hver fil... det er sådan lidt forskelligt hvordan man vælger...
Men uanset hvad ville jeg nok altid vælge at sende fil data binært, så det ikke skal igennem noget "formaterings helvede"...
Synes godt om
Slettet bruger
28. august 2006 - 11:08#8
problemet ligger bare i at det ikke er min stærke side at tænke sådan noget igennem
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.