07. marts 2002 - 12:08Der er
15 kommentarer og 3 løsninger
Søges: nonblocking asyncron forbindelse
Område: Delphi-komponent Søges: nonblocking asyncron forbindelse Haves: Indy 9 - blocking syncron forbindelse Scenarie: To computere A og B. B forbinder til A. B er en client, A er en server. B kan nu sende en meddelelse til A, eller A til B. B kan sende to i træk til A, og omvendt. De skal altså ikke skiftes til at sende. Altså skal de begge fungere som en slags klienter, men jeg vil kun have én forbindelse! Hverken A eller B må hænge (okay, jeg kan jo lave en thread, hvis det er nødvendigt...)
Kan dette lade sig gøre? Evt. også med indy som jeg jo kender?
TClientSocket og TServerSocket har jeg ikke så gode erfaringer med. Der går kuk idet hvis man forsøger at overføre store datamængder (hvilket jeg også har brug for...) Jeg har ikke adgang til delte mapper på drevet.
Jeg forstår ikke det du siger Jens... Problemet med Indy er som jeg ser det, at man skal skrive fx Read* for at vente på en datapakke, men hvis man nu selv vil sende noget før Read har returneret kan det ikke lade sig gøre...
Det skulle helst være helt messagestyret, så jeg bare fik en event i min vcl thread når der kom en besked fra den anden. Server og klient skulle på overfladen opføre sig helt ens...
Brug TClientSocket og TServerSocket Det er meget nemt, og de kan også håndtere store datamængder. Dataerne vil blive sendt i mindre pakker, som du så bare skal samle sammen til en igen. Hverken A eller B vil hænge da begge komponenter kører i deres egen tråd.
okay. Sidder og leger med TClient/ServerSocket, og det er jo i virkeligheden det jeg har brug for. Men jeg gider ikke rigtig bruge 1 uge på at skrive noget kode der kan stykke de bittesmå dele information sammen igen. Selvom jeg blot sender en integer og en streng får serveren to OnClientRead events. Kan man ikke begrænse dette? Ellers - kender I nogle gode steder hvor jeg kan downloade komponenter bygget på TClient/ServerSocket eller blot visende eksempler på deres brug? NB: Pointene er sat op.
Hvis du sender en pakke på f.eks 128 bytes, så vil du også modtage disse data i en hel pakke. Dine data bliver først "splittet ad" når du sender større mængder data ad gangen f.eks 4kb,8kb eller 1mb alt afhængig af hvad dit netkort er sat op til at sende på en gang.
Jeg har bruft Socket komponenterne i stor stil i et message system, med over 200 clienter. Det virkede upåklageligt.
Jeg kan ikke helt forstå, at du få to OnReadEvents, ved at sende en pakke som kun fylder 4 bytes ?. Jeg har nogle gange oplevet, at der genereres en OnReadEvent ved opstart, men ellers ikke.
Hvis du sender f.eks 4 bytes men i OnReadEvent kun læser 2 bytes ( ReceiveBuf(Pakke,2) ), så vil der blive genereret en event mere, da der jo mere data til dig.
Det ser godt ud allesammen :) Nu sidder jeg så og tænker på... hvilken serverkomponent er bedst til at handle mange client-connections samtidigt? Jeg prøvede med ServerSocket/ClientSocket. Klienterne brød ned, når der var mere end 10 samtidige connections hos serveren og der var ingen mulighed for at trappe de exceptions der opstod :/ Det skal siges at jeg satte dem til at connecte stort set samtidigt, men alligevel...
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.