Avatar billede Slettet bruger
24. august 2006 - 08:27 Der er 8 kommentarer

Sprøgsmål til Arne, eller andre net eksperter

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.
Avatar billede ladyhawke Novice
24. august 2006 - 09:09 #1
det er det måske, men det er da en kende svært hvis du antager vi skal gøre det pr. tankelæsning!

Kom med noget kode så folk kan se om de kan hjælpe dig...
Avatar billede Slettet bruger
24. august 2006 - 09:23 #2
Vedlagde ikke koden da det ser super roddet ud her på experten at indsætte kode.. men her kommer det:


Min lytte tråd:

private void TCPListenThread()
        {
            byte[] buffer = new byte[10000];
            string IP;
            TcpClient CurrentClient;
            StreamReader SReader;

            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());
                       
                        if (CurrentClient.Available > 0)
                        {
                            string stringData = SReader.ReadLine();
                            string RefCmd = "";
                            string RefArg = "";

                            //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");
                }
            }
        }
Avatar billede Slettet bruger
24. august 2006 - 09:26 #3
Sende tråd:

private void AddFileToUploadList(string hPath, string RandomID, TcpClient hClient)
        {
            int RowCount = UploadListview.RowCount;
            TableModel2.Rows.Add(new Row());
            TableModel2.Rows[RowCount].Cells.Add(new Cell(Path.GetFileName(hPath)));
            TableModel2.Rows[RowCount].Cells.Add(new Cell(""));
            TableModel2.Rows[RowCount].Cells.Add(new Cell(""));
            TableModel2.Rows[RowCount].Cells.Add(new Cell(0));
            TableModel2.Rows[RowCount].Cells.Add(new Cell(""));
            TableModel2.Rows[RowCount].Cells.Add(new Cell("Forbundet"));

            char[] buffer = new char[1000];
            int ReadCounter = 0;

            FileStream dFile = new FileStream(hPath, FileMode.Open, FileAccess.Read);
            StreamReader sr1 = new StreamReader(dFile);
            StreamWriter wr = new StreamWriter(hClient.GetStream());

            while (ReadCounter < dFile.Length)
            {
                sr1.Read(buffer, ReadCounter, buffer.Length);
                wr.WriteLine(buffer);
                wr.Flush();

                //hClient.Client.Send(Encoding.ASCII.GetBytes("?sendingfile" + CMDChar + RandomID + CMDChar + dFile.Length + CMDChar + new String(buffer)));
                ReadCounter += buffer.Length;
               
                Thread.Sleep(50);
            }
            wr.Close();
            sr1.Close();
            dFile.Close();

            hClient.Client.Send(Encoding.ASCII.GetBytes("?endsendfile" + CMDChar));
        }
Avatar billede md_craig Nybegynder
25. august 2006 - 13:59 #4
Du overfører fil data som strings (text) eller hvad? o.O ...
Avatar billede Slettet bruger
26. august 2006 - 14:35 #5
Det gør jeg vidst ja.. har du et bedre forslag?
Avatar billede arne_v Ekspert
27. august 2006 - 03:40 #6
Jeg ville også sende kommando via StreamWriter.

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.
Avatar billede md_craig Nybegynder
28. august 2006 - 08:52 #7
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"...
Avatar billede 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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester