![]() |
Record in Stream speicher und über netzwerk verschicken
Da sind schonmal die beiden Records:
Code:
Der Client sieht nun so aus
type TMessage = Record
Command:String; End; TMessage_Header = Record Size:Longword; End;
Code:
procedure TForm1.btn_testClick(Sender: TObject);
var Msg:TMessage; Header:TMessage_Header; sendstream:TMemorystream; begin sendstream:=TMemorystream.create; Msg.Command:='test'; Header.Size:=sizeof(Msg); sendstream.WriteBuffer(header,sizeof(header)); sendstream.WriteBuffer(Msg,header.size); sendstream.position:=0; Client.Socket.SendStream(sendstream); end; So siehts im server aus:
Code:
So, wenn ich dann das schowmessage im letzten teil, net_decodemessage mache, kommt nur ein leeres fenster. binde ich dieselben 3 zeilen allerdings direkt in den client ein, klappt alles bestens
procedure TForm1.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket); var nRead : Integer; Buff : Array[Word] Of Byte; OldPos : Integer; begin OldPos := fdata.Position; fData.Position := fData.Size; Repeat nRead := Socket.ReceiveBuf(buff, High(Buff) - Low(Buff)); fData.WriteBuffer(buff, nRead); Until ( Socket.ReceiveLength = 0 ); fData.Position := OldPos; net_decodestream(fdata); end; procedure net_decodestream(var data:TMemorystream); Var Header:TMessage_Header; Msg:TMessage; Begin data.ReadBuffer(header,sizeof(header)); data.readbuffer(msg,header.size); showmessage(msg.command); End; |
Re: Record in Stream speicher und über netzwerk verschicken
ich geh mal davon aus das du dich über den leeren string wunderst?? wenn du mal sizeof(String) aufrufst wirst du sehen das die größe immer gleich ist egal wieviel zeischen du in dem string hast. Liegt daran das string eigentlich auch nur ein pointer ist der irgendwo hinn im speicher zeigt.. Imho versendest du nur die Speicheradresse... Du solltest demnach deinen string direkt in den buffer schreiben den du sendest oder anstelle von string array of char etc. verwenden
|
Re: Record in Stream speicher und über netzwerk verschicken
Gibs da denn keine Möglichkeit das auch mit Records zu machen?? da sollen nämlich später noch mehr variablen rein.
Das mit dem sizeof stimt, das ist gleich, nur der inhalt nicht PartyPansi |
Re: Record in Stream speicher und über netzwerk verschicken
wie gesagt, anstelle von String einfach ein "Array of Char" verwenden. Oder du schreibst dir eien procedure die den inhalt vom string in den stream/buffer speichert
|
Re: Record in Stream speicher und über netzwerk verschicken
Hi,
also hab mir jetzt zwei kleine prozeduren geschrieben, die den string in nen Array of char umwandeln und umgekehrt. klappt bestens. danke für die hilfe, PartyPansi |
Re: Record in Stream speicher und über netzwerk verschicken
Hallo!
ich hab das jetzt mal probiert... allerdings funktioniert das bei mir nicht wirklich. Hab ich was vergessen?
Delphi-Quellcode:
Danke, Daniel
unit uMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp; type TStrArr = array of char; type UserRec = record id : integer; Username : TStrArr; Password : TStrArr; end; TMessage_Header = Record Size : Longword; End; type TForm1 = class(TForm) client: TClientSocket; server: TServerSocket; Memo1: TMemo; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure serverClientRead(Sender: TObject; Socket: TCustomWinSocket); private function ChartoStr(strarr: TStrArr): String; function StrToChar(str: String): TStrArr; { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Clear; server.Port := 32; client.Port := 32; server.Active := TRUE; client.Host := '127.0.0.1'; client.Active := true; end; procedure TForm1.Button1Click(Sender: TObject); var header : TMessage_Header; sendstream : TMemoryStream; ur : UserRec; begin sendstream:=TMemorystream.create; ur.id := 1; ur.Username := strtochar('username'); ur.Password := strtochar('password'); header.Size := SizeOf(ur); sendstream.WriteBuffer(Header, SizeOf(Header)); sendstream.WriteBuffer(ur,sizeof(ur)); sendstream.position := 0; client.Socket.SendStream(sendstream); end; function TForm1.ChartoStr(strarr: TStrArr): String; var i : integer; begin result := ''; for i := 0 to SizeOf(strarr)-1 do begin result := result + strarr[i]; end; end; function TForm1.StrToChar(str: String): TStrArr; var i : integer; begin SetLength(result, length(str)); for i := 1 to length(str) do begin result[i-1] := str[i]; end; end; procedure TForm1.serverClientRead(Sender: TObject; Socket: TCustomWinSocket); var rec : UserRec; header : TMessage_Header; nRead : Integer; Buff : Array[Word] Of Byte; OldPos : Integer; fdata : TMemoryStream; begin fdata := TMemoryStream.Create; OldPos := fdata.Position; fData.Position := fData.Size; Repeat nRead := Socket.ReceiveBuf(buff, High(Buff) - Low(Buff)); fData.WriteBuffer(buff, nRead); Until ( Socket.ReceiveLength = 0 ); fData.Position := OldPos; fdata.ReadBuffer(header, sizeof(header)); fdata.readbuffer(rec, header.size); Memo1.Lines.Add(inttostr(rec.id)); Memo1.Lines.Add(chartostr(rec.Username)); Memo1.Lines.Add(chartostr(rec.Password)); fdata.Free; end; end. |
Re: Record in Stream speicher und über netzwerk verschicken
Moin!
Du kannst es auch so machen, das du jeden String so sendest, dass du erstmal die Länge des selbigen in den Stream schreibst und danach den String. Ein Beispiel dazu findest du u.a. in meinem Chat bei mir auf meiner HP unter Delphi/Projects/Chat. MfG Muetze1 |
Re: Record in Stream speicher und über netzwerk verschicken
Hallo!
danke für den Tipp - aber könnstest du (oder jmd anders) mir noch sagen was bei obigem code falsch ist? ich komm einfach nich drauf... cya |
Re: Record in Stream speicher und über netzwerk verschicken
klappt nicht / post war müll
|
Re: Record in Stream speicher und über netzwerk verschicken
Moin!
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz