Entwickler-Ecke

Internet / Netzwerk - TSocket: Wie Buf von Server zu Client senden ???


g1o2k4 - Di 03.04.07 16:00
Titel: TSocket: Wie Buf von Server zu Client senden ???
hi zusammen

soweit bin ich bis jetzt gekommen (senden eines bufs vom clienten zum server, nach dem tutorial von dsdt.info), aber wie sende ich einen solchen buf vom server zum clienten ??? kann mir jemand helfen vielleicht mit nem quelltext beispiel ?:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
  public
    Server: TServerSocket;
    Client: TClientSocket;
    MSG: String;

    { Public-Deklarationen }
  end;

type
  CustomRec = record
    Text: string;
    Zahl:integer;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
end;

procedure TForm1.CheckMSG;
begin
  if MSG = 'Starte Winamp' then shellexecute(handle,'open','C:\Programme\Winamp\Winamp.exe',nil,nil,sw_show);;

end;



procedure TForm1.FormDestroy(Sender: TObject);
begin
    Client.Free;
    Server.Free;
end;

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  Rec: CustomRec;
begin
 //wir holen unseren Record ab...
  Socket.ReceiveBuf(Rec,SizeOf(Rec));
  //...und übertragen den Inhalt in das MemoFeld
  with Rec do begin
    Memo1.Lines.Add(Text);
    Memo1.Lines.Add(IntToStr(Zahl));
    MSG := Rec.Text;
    CheckMSG;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
  Client.Socket.Sendtext(Edit1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if (Edit2.Text = 'IP Adresse'or (Edit3.Text = 'Port'then ShowMessage('Bitte IP und Port eintragen')
  else
    begin
  Server := TServerSocket.Create(Form1);
  Memo1.Lines.Add('Server gestartet.');
  Client := TClientSocket.Create(Form1);
  Memo1.Lines.Add('Client gestartet.');
  try
    Server.Port := strtoint(Edit3.Text);
    Server.Open;
    Memo1.Lines.Add('Server hört.');
    Client.Port := strtoint(Edit3.Text);;
    Client.Host := Edit2.text;
    Client.Open;
    Memo1.Lines.Add('Client hört.');
  except
    Client.Free;
    Server.Free;
    Memo1.Lines.Add('Fehler. Client und Server werden geschlossen.');
  end;

  end;
  Server.OnClientRead := ServerClientRead;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Rec: CustomRec;
begin
  //Unserem Record werden Werte zugewiesen
  with Rec do begin
    Text := 'Starte Winamp';
    //In Edit2 nur Zahlen eingeben!
    Zahl := 2;
  end;
  //Unser Record wird verschickt!
  Client.Socket.SendBuf(Rec,sizeof(Rec));
end;


end.


danke.

grüße g1o2k4


Narses - Di 03.04.07 16:47

Moin!

Du kannst keine records mit dynamischen Datentypen versenden, siehe FAQ-Beitrag [http://www.delphi-library.de/topic_Probleme+beim+SendenEmpfangen+von+records++dyn+Objekten_60793.html]. :mahn: ;)

cu
Narses


g1o2k4 - Di 03.04.07 16:52

doch es geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Client->Server:
Client.Socket.SendBuf(Rec,sizeof(Rec));

und Server->Client:
Server.Socket.Connections[0].SendBuf(Rec,sizeof(Rec));
//Connection[0] gibt den Clienten an zu dem etwas geschickt werden soll....


beim Clienten muss dann "OnRead" Socket.ReceiveBuf(); eingefügt werdenb und beim Server unter OnClientRead.


Narses - Di 03.04.07 16:59

Moin!

Ich beziehe mich auf diese Deklaration aus deinem Code oben:

Delphi-Quelltext
1:
2:
3:
4:
5:
type  
  CustomRec = record  
    Text: string;  
    Zahl:integer;  
end;


user profile icong1o2k4 hat folgendes geschrieben:
doch es geht:

Nein, es geht nicht; und wenn du den FAQ-Beitrag gelesen hättest, wäre dir sogar klar, warum. ;) (kleiner Tipp: lass dir mal SizeOf(CustomRec) anzeigen und vergleich das mit der Datenmenge, die du wirklich senden willst... :D)

Abgesehen davon: wenn du doch schon weißt, wie´s geht, warum fragst du dann noch... :gruebel:

cu
Narses


g1o2k4 - Di 03.04.07 19:46

ich habs ja erst vorhin herausgefunden.
aber wenn es angeblich nicht geht wieso kommt dann das an was ich gesendet habe ? (ich kann es auch korrekt ausgeben) - keine spur von "das geht nicht"


Fighter#1 - Di 03.04.07 20:18

Also bei mir funktioniert der Code wie von die beschrieben, wie Narses es Profeziehen hat NICHT AN!
Die Zahl funktioniert aber der String nicht, is ja auch klar.
Les dir sein bitte FAQ durch!


g1o2k4 - Di 03.04.07 21:13

ok also hab mir die faq jetzt angesehn.
kommt es jetzt also auf die länge des strings an ? wenn man wie beschrieben string[20] einsetzt wird jeder beliebig lange string auf 20 zeichen gekürzt ?
mehr als 10 zeichen will ich eh nicht senden...dafür sollte es doch ohne protokoll gehn oder ?


Narses - Di 03.04.07 21:17

Moin!

user profile icong1o2k4 hat folgendes geschrieben:
kommt es jetzt also auf die länge des strings an ?

Jain, auf den Datentyp (dynamisch <-> statisch). ;)

user profile icong1o2k4 hat folgendes geschrieben:
wenn man wie beschrieben string[20] einsetzt wird jeder beliebig lange string auf 20 zeichen gekürzt ?

Im Zweifel, weiß ich aber grad nicht genau, was passiert, wenn man mehr als die definierte Menge Zeichen zuweisen will. :? Probier´s halt aus. ;)

user profile icong1o2k4 hat folgendes geschrieben:
mehr als 10 zeichen will ich eh nicht senden...dafür sollte es doch ohne protokoll gehn oder ?

Ja, allerdings hast du dann immernoch dieses Problem hier [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html]; und das ist nicht so einfach zu lösen... ;) jedenfalls nicht ohne ein Protokoll... :P

cu
Narses