Írunk egy programot fájlok küldésére foglalatok, az internet és a hálózatok, cikkek, programozás -
A kezdők programozói (és én, amikor elkezdtem tanulni a Delphi-t), megkérdezik: hogyan tudom átvinni a fájlt a foglalatokon keresztül, ha a fájlon kívül sok információt továbbítanak az aljzaton keresztül. Úgy tűnik, hogy a probléma nem olyan bonyolult, de nem könnyű. Egy hosszú keresés után az interneten soha nem találtam hasznos cikket ebben a témában. Ezért úgy döntöttem, hogy megjavítom ezt a hibát, és ebben a cikkben megpróbálom segíteni a probléma megoldásában.
Írjunk egy olyan programot, amely fájlokat tud átvinni a socket (kliens és kiszolgáló) segítségével, valamint egyéb parancsokat, például néhány üzenetet. Az ügyfél fájlokat vagy parancsokat fog kapni, és a kiszolgáló elküldi. Ha az ügyfél mindent ír a pufferre, akkor a fájlon kívül parancsok is lesznek, és meg kell győződnünk arról, hogy a fájlok és parancsok semmilyen módon nem egyesülnek. Mégis, hogy figyelembe kell venni, hogy ha egy nagy fájl a szállítás, akkor vágjuk több csomagot, hogy van, továbbítja a fájl nem ugyanabban a csomagban, de egy pár, és OnClientRead esemény kerül többször kérte. Ez az átvitel fő problémája!
A parancsok elválasztására a fájlból először küldje el a következő sort az ügyfélnek: "file # file.txt # 16", azaz: parancs + határoló + fájlnév + határoló + fájlméret.
Ennek a parancsnak a fogadása után az ügyfél a fájlfogadási módba lép, és mindent beír a pufferbe, amíg a fájlméret megegyezik a fogadott adatok méretével. Így az ügyfél elválasztja a parancsokat a fájlból!
És így tovább írjuk a kódot:
Kezdjük a kiszolgálóval (elküldi a fájlt):
Helyezze a következő összetevőket az űrlapra: TServerSocket, TButton, TEdit, TProgressBar és TStatiusBar. Helyezze el őket a képen látható módon.
Telepítse a TServerSocket összetevőt, port: 1001.
Állítsa be a TStatusBar összetevőt, a SimplePanel változót true értékre.
A sorban. az átvitel fájlszáma be van írva, a TButton gomb a fájl átvitelére szolgál.
Először, adj hozzá egy puffert a fájlhoz globális változókhoz:
Most nyissuk ki az aljzatot az űrlap létrehozásakor:
Az alkalmazás végén nem szabad elfelejteni bezárni az aljzatot:
A gomb megnyomása elküldi a fájlt:
Az OnClientRead eseményen, a TServerSocket összetevőn írja be a következő kódot:
Ehhez a kiszolgálónak meg kell tennie a puffert, csak miután megkapta a fájlt. Ha megöli a puffert, közvetlenül az átviteli fájl után, az ügyfélnek nincs ideje a teljes fájl átvételére. Amint az ügyfél elfogadja a fájlt, elküldi a "vég" parancsot a kiszolgálónak, ami azt jelenti, hogy a fájl elfogadásra kerül, és a kiszolgáló megöli a puffert.
Most tesszük a szerverünknek néhány információt a kapcsolatról:
Az OnClientConnect eseményen, a TServerSocket összetevőn írja be a következő kódot:
Az OnClientDisconnect esemény esetében írja be:
Itt van a szerver és készen áll. Most menj az ügyfélhez (ez eltartja a fájlt) a PIM zavarban lesz még:
Nyilatkozni a változókról és a szüneteltetési eljárásról. Írja be a változókat privát módon. egyébként semmi sem fog működni:
Az űrlap létrehozásakor kapcsolatba lépünk a kiszolgálóval és várjuk a fájl átvitelét:
Az alkalmazás végén zárja le az aljzatot:
Szóval, csakúgy, mint a kiszolgálón, tegyük az ügyfelet a kapcsolatról:
Most be kell írnunk a kódot az Írásban. Ez az eljárás szükséges annak biztosítására, hogy a kapott adatok egy fájlba íródjanak. Eljárásmód:
Most a TClientSocket összetevő OnClientRead eseményén adja meg a következő kódot:
Így, ha egy nagy fájlt, és OnClientRead esemény lesz az úgynevezett nem egyszer, hanem több, akkor, ha az ügyfél fájl vételi mód, akkor rögzíti az adatokat a puffer, és ha nem, akkor az ügyfél határozza meg a kapott parancsot, és ha ez a fájl, a fájlfogadási módba kerül. Ha nem értesz valamit, akkor olvassa el a program kódját, nem véletlenül osztottam le mindent :-)
Nos, ez minden.
Az ügyfél és a szerver készen áll. Először indítsa el a kiszolgálót, majd az ügyfelet, és megpróbáljon több megabyte méretű fájlokat átvinni :-) 10-12 MB fájlt küldött a hálózaton problémamentesen.
Sok szerencsét a programozás!