Avatar billede delphin Nybegynder
27. november 2006 - 17:05 Der er 4 kommentarer

TServerSocket/TClientSocket - send lange tekster

Jeg har to programmer der kører på hver sin computer og snakker samme vha. TServerSocket/TClientSocket - noget a la:

var text: string;

//send
ServerSocket.Socket.Connections[0].SendText(text);

//modtag - brug "OnRead" event for clientsocket
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);

begin
..
  text:=Socket.ReceiveText;
..
end

Det har hidtil virket fint (når jeg kun sender omkring 200 tegn), men nu sender jeg måske N-tegn hvor N<5000. Problemet er at det virker som om teksten bliver delt op og "OnRead" bliver kaldt flere gange, men jeg ville gerne have alt teksten overført i en "pakke" og ikke få den delt op (og dermed også undgå at "OnRead" bliver kaldt flere gange når jeg bare overfører én lang tekst.

Hvordan kan jeg gøre dette? Skal jeg bruge noget andet end "sendtext()" eller ???
Avatar billede kroning Nybegynder
28. november 2006 - 08:35 #1
Jeg er lidt rusten i TCP/IP men når nu ingen andre har svaret.
Data sendt med TCP dvs. TServerSocket/TClientSocket vil altid blive opdelt hvis data mængden overstiger en vis mængde, hvornår der bliver opdelt kommer an på hvilke net IP pakkerne skal sendes igennem, jeg mener at max pakke størrelse på f.eks. ethernet er 1500 bytes.
Dvs. at når du benytter TServerSocket/TClientSocket så skal du opfinde din egen protokol så du ved hvornår en ny stak data starter og hvornår det er slut. En enkelt måde kunne være at sendet et start tegn/streng når du starter med at sende og et slut tegn/streng når de sidste data er sendt således at modtageren ved at nu kommer der ikke mere.
Avatar billede delphin Nybegynder
28. november 2006 - 10:03 #2
Jeg havde jo nok lidt forventet det svar - men mange tak alligevel :-)

Det jeg synes er træls er at ClientSocketRead bliver kaldt flere gange - hvordan samler man de sendte data på en pæn måde - hvis jeg selv deler det op i små datapakker og sender vha. ServerSocket.Socket.Connections[0].SendText(text) flere gange i træk synes jeg også den samler nogle af mine pakker (med mindre jeg sætter sleep(200) eller noget ind mellem hver gang jeg sender).

Jeg synes der burde være noget kode man bare kunne bruge i stedet for selv at skulle lave en eller anden nogenlunde fornuftig løsning? Hvad med at bruge sendstream eller sendbuf i stedet for?
Avatar billede kroning Nybegynder
28. november 2006 - 15:28 #3
Jeg har aldrig brugt Stream i forbindelse med TCP så det kan jeg ikke sige noget om, men det kan en anden sikkert.
Avatar billede kammeyer Nybegynder
02. december 2006 - 13:14 #4
Lav din egen header - kunne f.eks. være START_1583 og efterfulgt af 1583 tegn, hvis det er 1583 tegn der skal sendes. Således ved du på modtagersiden at der skal være 1583 tegn til sidst (foruden "START_1583 ").
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
Kurser inden for grundlæggende programmering

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