Ind til videre har jeg tænkt mig at bruge TCP. (det er nok også det nemmeste )
Men jeg har et problem hvordan kan jeg sende flere informationer over samme forbindelse???
EX:
Login: ja
Navn: Darkfighter
Pass: 12345
Ip: 23.344.23.23
Og så skal serveren dele Informationerne ud flere fo4rskællige steder i Server programmet hvordan gør jeg det???
Jeg ved det er muligt får andre programmer må jo også gøre det ikk??
nogen der kan hjælpe???
PS: Michael Skovslund?? Hvad mener du med at lave min egen protokol og hvordan gør jeg så det??
Håber der er nogen der vil hjælpe mig...
Hej,
Jeg tror vi snakker lidt forbi hinanden.
TCP/IP er, kort sagt, et transportlag som giver dig mulighed for a skabe en forbindelse fra A til B.
A er en klient og B en server. B skal, som server, "lytte" på en port som A så skal forbinde sig til.
Når der er skabt en forbindelse så er det at protokollen kommer ind i billedet.
En protokol er en specifikation af hvordan dine dataer skal sendes frem og tilbage.
Som eksempel kunne du bruge XML (eller noget andet) som protokol.
Lad os sige at du vil bruge XML.
Så kunne du sende data fra A (Klienten) i følgende format:
<MESSENGER version="1.0">
<ACTION type="login" direction="request">
<USER>darkfighter</USER>
<PASSWORD>12345</PASSWORD>
</ACTION>
</MESSENGER>
Som du nok kan se ligner XML meget HTML syntaksen.
Der er nu kun et problem tilbage....Hvordan ved B at A er færdig med at sende data???
Her kan man f.eks. bruge HTTP eller selv finde på noget.
Alt hvad HTTP gør er at pakke data ind i en header, så klienten (eller serveren) ved hvor meget data der skal modtages. Det er jo også denne funktionalitet som du leder efter
Lad os prøve at lave en selv.
Men før vi går i gang bør vi nok se på hvilke informationer som vi har brug for i vores header.
1. Data længden (ikke medregnende headeren).
2. Data transport type (forklaring lidt senere).
3. Header slut Tag (eller Data start tag
).
Okay, så har vi defineret hvilke elementer vi vil ha i headeren. Så er det vist på tide at specificere hvert enkelt element og deres værdier. Først lad os sige at headeren er tekst orienteret (fylder lidt mere men nemmere at forstå og debugge).
Data længde (1):
Identificeret ved elementet "Length: ".
Efter "Length: ", angives længden af de data som skal sendes.
Data transport type (2):
Identificeret ved elementet "Transport: ".
Efter elementet, angives der hvilken type transport vi vil bruge.
Lad os bruge 2 typer:
- PLAIN:
Normal tekst sendes i en stor klump.
- BLOCK:
Data sendes i mindre bidder (bruges hvis du ikke kender størrelsen af dine data som skal sendes).
Header slut tag (3):
Her bruger vi en konstant tekst som angiver at headeren er slut.
Lad os bruge "HEADER_END" som slut tag.
Så vil det se nogenlude sådan her ud når der sendes data:
Length: xxxxx
Transport: (PLAIN | BLOCK)
HEADER_END
...her kommer dine data så.
Hvis vi nu tager XML eksemplet og putter det ind i vores header:
Length: 159
Transport: PLAIN
HEADER_END
<MESSENGER version="1.0">
<ACTION type="login" direction="request">
<USER>darkfighter</USER>
<PASSWORD>12345</PASSWORD>
</ACTION>
</MESSENGER>
Eks. ovenfor viser hvad klienten (A) sender til serven (B) for at logge ind.
B svarer så tilbage til A for at fortælle at A er logget ind:
Length: 131
Transport: PLAIN
HEADER_END
<MESSENGER version="1.0">
<ACTION type="login" direction="reply">
<RESULT error="0">User logged in</RESULT>
</ACTION>
</MESSENGER>
[/PRE]
Eks. ovenfor returnere at A er blevet logget ind.
Jeg har ikke beskrevet BLOCK typen, da jeg ikker er sikker på hvordan du vil gøre det. Hvis stadigvæk er interesseret så kan jeg beskrive den for dig senere.
Når du sender fra A til B kan du bare sende det som en streng. Hvis det var mig der skulle lave denne protokol, så ville jge lave en klasse som kan sørge for at pakke dine data ind i en header inden de bliver sendt.
Her er en implementering til at læse/skrive data indpakket i en header. Det skal dog siges at jeg ikke har testet klassen da den er skrevet ind direkte her.
type
TTransportProtocol = class(TObject)
private
protected
public
// Encoding the AData into the header, returns the complete data string to send.
function EncodeData(AData : String) : String;
// Decoding the AHeaderData and returns the data with out the header.
function DecodeData(AHeaderData : String) : String;
end;
implementation
// Encoding the AData into the header, returns the complete data string to send.
function TTransportProtocol.EncodeData(AData : String) : String;
begin
Result := 'Length: '+IntToStr(Length(AData))+#13#10; // længden af data
Result := Result + 'Transport: PLAIN'+#13#10; // vi overfører alle data på een gang.
Result := Result + 'HEADER_END'+#13#10; // Slut på headeren.
Result := Result + AData;
end;
// Decoding the AHeaderData and returns the data with out the header.
function TTransportProtocol.DecodeData(AHeaderData : String) : String;
var
Header : String;
LenStr : String;
L : Integer;
begin
// put headeren i en ny streng.
Header := Copy(AHeaderData, 1, Pos(AHeaderData, 'HEADER_END')+11);
// Hent "Length:" linien.
LenStr := Copy(Header, Pos(Header, 'Length:'), Length(Header));
// Find længden af dataerne som tilhører denne header.
L := StrToInt(Copy(LenStr, 8, Pos(LenStr, #13#10)));
// Se om vi har alle data.
if (L = Length(AHeaderData)-Length(Header)) then // okay alle data findes, så returner dem.
Result := Copy(AHeaderData, Length(Header)+1, Length(AHeaderData))
else
Result := ''; // alle dataer er ikke hentet endnu.
end;
end.
Jeg håber at dette giver dig lidt mere forståelse for hvordan det kan laves.
/Michael.