16. oktober 2004 - 17:37Der er
77 kommentarer og 1 løsning
Socketbasseret overførsel af data
Jeg har et serverprogram, hvor man kan vælge en fil i. Klienterne på intranettet (med dynamiske IP'er) kan så klikke på filnavnene på en HTMLbasseret brugergrænseflade. Men hvordan lyder koden så for, at der bliver oprettet en dataoverførsel mellem de 2 computere? Jeg har en idé om, at lave en løsning, hvor aplikationen registrerer clientens ip, åbner en socketport på clientens maskine og så sender data fra min maskine (serveren) over til clienten sådan. Men hvordan laver man det kodemæssigt?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hvis client programmet allerede har en socket åben til server programmet, så kan du vælge at bruge den eller du kan åbne en ny. Hvis du vælger at åbne en ny, så kan du vælge om det er client eller server som skal etablere connection. Ved det valg skal du tænke firewalls !!
Clienten er en browser, ja. Hvis jeg skal tænke firewalls ved det ene valg, så tror jeg bare, at vi vælger den anden løsning, så det bliver så ligetil som muligt. HVordan ser den anden løsnng ud kodemæsiigt?
Altså clienten starter serverHTML'en over intranettet ved simple kald af aspx-siden. Her blver de så præsenteret for et link til en fil, som de på den måde skal kunne overføre til deres egen computer vha et klik på linket. Mere ved jeg ikke, hvad jeg skal svare til de førnævnte spørgsmål....
Hvis det pågældende link er et ægte HTML link, så behøver de vel slet ikke noget program på client, så requester browseren det vel bare fra serveren og alt arbejdet går ud på er at lave den rigtige URL i linket.
Ja, men der opstår nogle uforklarlige problemer med den løsning. Det fungerer i hvert fald ikke. Derfor ville jeg lave en socketbaseret løsning, som træder i kræft, når cllienten requester en fil.
... måske vi burde få løst de uforklarlelige problemer først, istedet for at starte på noget helt nyt. Hvad er det som ikke du'r? Hvilket prorgram er det der serverer html-siderne til klienten? Hvor ligger filerne, på klientens maskine?
Det er en længere historie. Det er bl.a. nogle aspx-filer, nogle html-sider og noget database. Men det skulle være sat rigtig op. Jeg har før fået hjælp med opsætningen af det. Problemet er sikkert, at clientcomputerne ikke er sat korrekt op til at understøtte funktionalitetten. Og det kan jeg formentlig komme ud over, ved at implementere den førnævnte løsning.
Men jeg forstod det egentlig sådan, at du havde et eksempel, hvor klienten kunne klikke på et link i browseren, og hvor serveren så sendte filen til clienten? Og det må skam meget gerne være singletreaded....vel at mærke hvis det har den effekt, at 1 client kun kan hente data gennem 1 tråd ad gangen, men hvor der så godt kan være flere clienter, som hver henter data gennem 1 tråd hver for sig?
en applet kan enten være en System.Windows.Forms.Control eller en javaapplet. Rent kodemæssigt tror jeg at jeg er lige så forvirret som arne_v om dine hensigter, så jeg tror ikke jeg på stående fod kan komme med et eksempel som opfylder det du gerne vil have
clienten bliver præsenteret for nogle links (links til datafiler på serveren). Clienten præsenteres for dette gennem en browser. Når clienten så trykker på et link, skal data'en overføres fra serveren. Det er dette trin, som dette spørgsmål er oprettet til. Linket ved clienten er den absolute sti til data'ene på serveren (det er altså mapped o.s.v.). Denne sti skal så køres gennem appletten, som derved tilbyder clienten, at overføre de aktuelle data til clientcomputeren.
På serveren kører IIS med ASP.NET sim lytter på port 80 og en speciel server applikation som lytter på f.eks. port 12345.
Brugeren starter browseren og henter en dynamisk genereret side fra IIS/ASP.NET som vises.
Den side har et specielt link.
Når brugeren klikker på det link, så startes en client applikation med en absolut fil sti på serveren som argument som connecter til server applikationen på port 12345 og requester den pågældende fil.
Som serveren så sender til client der gemmer den på client PC'ens disk.
tja, serverenapplikationen er vel asp.NET siden? Og den lytter vel bare på port 80. Men det, jeg gerne vil implementere, er så en form for serverapplikation, som kan overføre data gennem en anden port. Men det er rigtig forstået ellers.
det med at få det installeret er vel noget med at oprette en policy i din AD (hvis i altså kører Windows-netværk) eller også noget med noget login-script ell. lign.
Det er så et program der ikke gør andet end at vente på at en server begynder at sende noget data til klienten. Og dette sker jo netop når at en bruger har trykket på et link, ikke sandt?
Ahh, jo. Nu kan jeg se lyset. Det var da en fiks løsning ;-)
Policy i AD siger mig dog ikke noget. Hvad betyder det? Og er det muligt, at der kan blive lagt et kodeeksempel herind på eksperten, hvor en mulig løsning er implementeret?
kodeeksempel til et program kan være det arne_v har postet... hvis du lige laver det om til enten en windows-service eller et GUI-program der er skjult for brugeren, indtil AcceptTcpClient() bliver udføjrt, hvorefter der kommer fe.sk. en progressbar eller en prompt om hvor filen skal gemmes, så ville det være fjong.
Jeg skal lige høre...som jeg har forstået det, så er det noget lign.: der installeres en backgroundservice på clienten, der klikkes på et link ved serveren, seren sender data til kllienten, som backgroundsservicen tager imod. Er det rigtig forstået? I de dokumenter, som jeg har læst om det, får jeg nemlig indtrykket, at en windowsservice kun kan køre på serveren. Hvad er så det rigtige? Det er da kun smart, hvis den kører på klienten....?
en service er rigtig nok bare et program der kører i baggrunden... og der er ingen regler for at det kun kan køre på en server. Jeg vil skyde på at der kører omkring 40 af dem bare på din computer lige nu. Det er lige fra services der håndterer Plug and Play, Printeren og firewall, til fildeling, dnsopslag, netværksforbindelser oh diskstyring.
Ja, du har forstået det rigtigt i samspillet mellem client og server. Det er i hvert fald den løsning som jeg ville satse på.
Jo, men har jeg som server så rettigheder til, at installere en windowsservice på en klient, når han kobler sif op til mig webside? Det ville jeg da regne med, at der var en masse sikkerhedsmæssige problemer med. Det har jeg da erfaret fra min javaprogramering...?
det kan kun lade sig gøre hvis du har rettigheder til maskinerne ved at de sidder på et LAN som du, eller noget du kender, har kontrol over. men jeg kunne også kun forestille mig at din løsning vil kunne bruges i et sådan scenario
1) hvis du laver den i c# skal klienterne køre med IE og have .net installeret 2) hvis du laver dne i java burde alle kunne se den, men så skal du over i java-kategorien for at få hjælp.
jeg kan dog ikke forstå. Hvis det ikke er en decideret intranet-opgave, hvorfor ialverden så ikke tage sig til takke med de muligheder som de etablerede standarder tilbyder?
Det ER en intranetopgave. Og de allerede eksisterende muligheder er ikke tilfredsstillende i dette tilfælde. Desuden vil jeg gerne lave denne løsning, da det giver mig noget erfaring indenfor området.
well.. hvis det ER en intranetopgave, hvad forhindrer dig så i at gå op til jeres edb-afdelingen og sige at du gerne vil have det her program installeret på alle de maskiner der skal bruge intranettet.
Det der forhindrer den løsning er, at jeg ikke har den type rettigheder på LAN'et. Derfor er jeg tvunget til, at lave min egen løsning. Jeg vil lave løsningen i c# og det dertilhørende. Hvis der så er nogle ting (f.eks. IE mangler), så må det jo bare være sådan. Det skal vi ikke tage hensyn til herinde. Hjalp det? :-)
jeg kan stadig ikke forstå... hvis det er en intranet-løsning der skal laves, så kan jeg ikke se problemet i at få et program installeret på alle de maskiner der skal bruge intranettet. Der må da være en form for firma-policy der gør det muligt.
Nå, men det skal jeg vel for så vidt heller ikke blande mig i - synes bare det lyder mærkværdigt.
Hvilket løsning skal vi så gå efter? C# applet'en der kun virker i IE, java eller ?
C#-løsningen har jeg hele tiden være "hooked" på ;-)
(firma-policy kan vi godt glemme. Jeg har KUN kontrol over min egen computer, som så skal fungere som en server mht. det program, jeg laver med dette EkspertSpørgtsmål)
det lyder som et rigtig fint intranet i har kørende :P
Well... en C#-applet er egentlig bare en Winform der arver fra Control i stedet for Form. Dvs. at man i bedste tilfælde kan designe og skrive al sin kode i VS.Net som om det var et windows-program og til sidst ændre arvingen så den arver fra System.Windows.Forms.Control istedet.
Når dette er gjort og det er kompilet til en dll-fil lægger du den i samme mappe som din UI-side, og via <applet>-tagget kan du så instantiere din control som fint dukker frem på siden. Her i kan du have en knap som starter en overførsel fra serveren.
c# er et sprog, vs.net er et program. umiddelbart vil jeg kode det i vs.net hvis du kan komme til det, eller er C#Develop også et udemærket udviklingsværktøj
Lyder for mig som om det er en simpel "læs en fil fra harddisken, og stream den tilbage til brugeren" funktion som er løbet løbsk :-). Men lytter da lige med en gang.
Jo, nu har jeg set lidt på det. Det kræver vist lige, at jeg kombinerer de 2 løsninger. Så det må jeg lige se på. Jeg kan dog ikke rigtig se, hvordan appletten starter noget op, hvor man kan vælge en placering, hvor dataoverførslen skal gemmes (jeg kan ikke se koden for det) ?
After you wrote your custom System.Windows.Forms.Control, create it with a parameterless constructor (which will be called by IE) and wrap it in an assembly.
?
Jeg mangler en forestilling om, hvordan man kalder denne box (som koden kulle generere, men som jeg faktisk ikke kan se nogen kode for), og hvordan datalinket så bliver overført til boxen, hvorefter boxen overfører data fra linket. Overførsel af data kan jeg nok hitte ud af (vha TCP), men resten kniber det med...
cogitans>> overførsel af data fra din datalist til applet'en kan gøres gennem javascript og dine get/set-metoder lavet i c#-klassen.
Placeringen af filen burde du kunne lave med en FileDialogBox - en simpel windows-control til valg af fil.
Det appleten skal starte op er jo en TcpClient som skal connecte til serveren på en given port og modtage filen. En oplagt mulighed ville være noget ala det her:
på din getFile.aspx-side har du dit applet som via javascript får overført querystring-variablen file. Dernæst åbner den en FileDialog, hvor brugeren kan vælge hvor filen skal gemmes. Når man har trykket ok opretter den en TcpClient som connecter til serveren, requester filen "c:\filer\fil.exe", og evt. viser en progressbar imens filen bliver downloadet.
Jeg har nu prøvet at implementere et forsøg. Men jeg har lige nogle spørgsmål til koden...den vil nemlig ikke kompileres. Ved denne linie går det galt:
Hvilken effekt har "/ttawin" ? Jeg tror nemlig, at det er her, hvor det går galt. filePath er vel bare stien gennem IIS, ik?
Og så lige et overordnet spørgsmål: Skal <script runat="server"> skrives i selve HTMLfilen (inde i scriptdelen står metoden OnLoad() f.eks..) ? Skal dette kode ikke stå i cobehindfilen -> altså i *.cs-filen?
ja... der skriver du samme kode som du normalt ville skrive i codebehind. hvis du bruger visual studio går du dog glip af intellisense, men det kommer i 2005'eren
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.