Entwickler-Ecke
Internet / Netzwerk - idTCP Server/Client Record in Stream versenden
lord_stelzer - Do 07.10.10 16:20
Titel: idTCP Server/Client Record in Stream versenden
Client:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.IdTCPClient1Connected(Sender: TObject); var SI : TServerInfo; Stream : TStream; Len : LongInt; begin Stream:=TMemoryStream.Create; idTCPClient1.IOHandler.WriteLn('0'); idTCPClient1.IOHandler.ReadStream(Stream); Stream.Position:=0; Stream.Read(Len, SizeOf(Len)); Stream.Read(SI, Len); Memo1.Lines.Add(SI.SName); Stream.Free; end; |
Server:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var art:string; SI : TServerInfo; Len : LongInt; Stream : TStream; begin art:=AContext.Connection.IOHandler.ReadLn; If art = '0' then Begin SI.SName:=Edit1.Text; Stream := TMemoryStream.Create; Len:=SizeOf(TServerInfo); Stream.Write(Len, SizeOf(Len)); Stream.Write(SI, Len); AContext.Connection.IOHandler.Write(Stream, 0, true); Stream.Free; End; |
Im Server-Programm funktioniert alles er bekommt die '0' = ServerInfo holen
und antwortet aber im Client bekomme ich eine EAccessViolation
lord_stelzer - Do 07.10.10 21:32
Habe den Fehler mittlerweile selber gefunden ;)
Wenn ich den Record definiere muss ich dem string eine feste Länge verpassen da es ja sonst nur ein Verweis ist und nur dieser übertragen wird.
Delphi-Quelltext
1: 2: 3:
| TServerInfo = record SName : string[255]; end; |
jaenicke - Fr 08.10.10 03:22
Besser ist aber den String selbst mit Länge direkt zu schreiben. Dann kannst du erstens auch längere Strings verschicken, zweitens werden kürzere Strings nicht mit Nullen aufgefüllt und drittens geht dann mit neueren Delphiversionen auch Unicode (ShortStrings können kein Unicode, von UTF-8 einmal abgesehen).
Wie geht das genau? So:
Delphi-Quelltext
1: 2: 3: 4:
| Stream.Write(PChar(MyString)^, Length(MyString)); ... SetLength(MyString, MyLength); Stream.Read(PChar(MyString)^, MyLength); |
Wenn wie hier die Länge des gesamten Strings schon die des Streams ist, kannst du die direkt nutzen. Du kannst aber auch mehrere Strings und andere Daten der Reihe nach schreiben. Dann kannst du die Länge jedes Strings einfach davorschreiben und dann zuerst auslesen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!