Bruke TServerSocket Component

Dette brevet ble opprinnelig postet til delphi3000.comThe Delphi dokumentasjon på TServerSocket sin multithreading evner kan virke litt sparsom for et utrent øye. Jeg vil prøve å kaste litt mer lys på subject.Actually det er ganske enkelt å lage en flertrådet server som lytter etter meldinger om en stikkontakt. Delphi har en komponent for at: TServerSocket.But du trenger en liten bit av kunnskap til å bruke it.In for å strukturere arbeidet ditt, bør du: - Legg en TServerSocket til hoved form.- Sett Servertype eiendom til stThreadBlocking- Lag en ny enhet (vist nedenfor) som inneholder server thread.Make følgende kode på OnSocketGetThreadprocedure TfrmMain.fSocketGetThread (Sender: TObject; ClientSocket: TServerClientWinSocket; Var SocketThread: TServerClientThread); begynne //Dette skaper TServerThread objektet jeg har vist //i koden under. Et nytt objekt opprettes hver gang //En ny tilkobling er opprettet. SocketThread: = TServerThread.Create (USANN, ClientSocket); end; The TServerThread er et objekt jeg har laget selv. Objekt inheits fra TServerClientThread og inneholder kode som faktisk leser og skriver fra socket.The enheten jeg laget inneholder minst følgende kode: enhet serverthread; interfaceuses vinduer, scktcomp, SysUtils, kurs, Skjemaer, skriver EServerThread = klasse (Unntak ); //Den serverthread er en etterkommer av den //TServerClientThread TServerThread = klasse (TServerClientThread) private fSocketStream: TWinSocketStream; offentlig prosedyre ClientExecute; styre; //Den ClientExecute overstyrer //TServerClientThread.ClientExecute //og inneholder selve koden som //henrettet når tråden er startet ende; implementationprocedure TServerThread.ClientExecute; begynner arvet FreeOnTerminate: = true; prøv fSocketStream: = TWinSocketStream.Create (ClientSocket, 100 000); //100000 er timeout i miliseconds. prøve mens (ikke Avsluttet) og (ClientSocket.Connected) prøver //Dette er hvor du vil gjøre selve //​​Venter på innspill, Lesing og skriving //Eksemplene nedenfor viser hva du kan //sette inn her. unntatt på e: unntak gjør begynne //Det har oppstått en feil, nært og exit ClientSocket.Close; Terminere; slutt; slutt; endelig fSocketStream.Free; slutt; unntatt på e: unntak gjør begynne //Det har oppstått en feil, nært og exit ClientSocket.Close; Terminere; slutt; end, end, Når tilkoblingen er opprettet, må tråden for å vente på innkommende data. Du kan bruke denne koden for å vente på data: if (ikke Avsluttet) og (ikke fSocketStream.WaitForData (1.000.000)) thenbegin //Håndter timeoutend; //Det er innkommende data på sokkelen for å lese data, bør du ha en! buffer til å lagre dataene i. Vanligvis bufferen er en PByteArray eller en rekke tegn. I dette eksempelet har jeg en buffer kalt frequest som er en rekke tegn. Videre jeg forventer et fast antall bytes. Min matrise har størrelsen av den konstante REQUESTSIZE.var ac, readlen: integer; begynne FillChar (frequest, REQUESTSIZE, 0); ac: = 0; gjenta readlen: = fSocketStream.Read (frequest [ac], 1024); //Jeg leste i biter av 1024 bytes før bufferen //er full ac: = ac + readlen; før (readlen = 0) eller (ac = REQUESTSIZE); end; Hvis readlen er 0 da jeg ikke motta flere data. Lesefunksjonen ganger ut etter 100000 miliseconds som nevnt i TWinSocketStream.Create (). Hvis du ikke vet hvor mye data du kan forvente, bør du sette denne timeout ganske liten. 30 sekunder bør være maksimalt i de fleste situations.When sende et svar, bør du være klar over dine kunder atferd. Mange kunder venter på en pakke av svar, mens andre forventer mange packages.In dette eksempelet har jeg en klient som bare forventer en pakke, så jeg må sende mine data tilbake i en blings: fSocketStream.WriteBuffer (fRep, fReplySize); Den fRep er svaret buffer, og fReplySize er størrelsen på replybuffer.



Previous:
Next Page: