Autor Beitrag
moe120
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 02.03.06 16:43 
hallo,
ich bin grad dabei mein projekt auf die indy10 komponenten umzustellen, habe im formular eine idtcpclient und eine idtcpserver komponente. der client zum verbinden mit dem selben programm auf einem anderen rechner und die server komponente zum beantworten der clientanfragen aus dem netz.

die verbindung 2er programminstanzen im netzwerk klappt, mein problem ist jedoch wenn ich mit programm1 was sende dann hört die onexecute routine der serverkomponente bei programm2 zu früh auf mit der abarbeitung.

hier die client prozedur

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button3Click(Sender: TObject);
begin

 ack_msg:='hi.';
 
 if not cs1.Connected then begin

 try cs1.Connect;
 finally
 end;

 end;
 
end;


procedure TForm1.cs1Connected(Sender: TObject);
begin
cs1.Socket.Writeln(ack_msg);
shape1.Brush.Color:=clGreen;
cs1.Disconnect;
end;



und hier die server empfangsroutine:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ss1Execute(AContext: TIdContext);
var msg: String;
      x: integer;
begin

with AContext.Connection do begin
 x:=socket.ReadInteger();      // <-- das wird noch ausgeführt, mit breakpoint überprüft
 msg:=socket.ReadString(x);   //<-- bei der zeile ist auf einmal schluss 
                              //    und ich kann nichtmal den inhalt von msg prüfen
 memo1.Lines.Add(msg);
end;

end;



was mach ich da falsch?
moe120 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mi 08.03.06 12:29 
Habs inzwischen lösen können, die Funktion Acontext.Connection.Socket.ReadString(..); war einfach falsch gewählt.

Hier mein korrigiertes Beispiel zum versenden beliebiger Daten über client und server mit indy10 komponenten (vielleicht hilfts ja mal jemandem):

Das zum senden benutzte Connected-Ereignis der Client Komponente:
ausblenden volle Höhe 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:
...
var const size=1024;
...

procedure TForm1.cs1Connected(Sender: TObject);
var conn, transmit: boolean;
    msg, tmsg: String;

begin

ack_msg:='hihi';
setlength(tmsg,size+12);

for x:=1 to size+12 do tmsg[x]:='0';
for x:=1 to length(ack_msg) do tmsg[x]:=ack_msg[x];
cs1.IOHandler.Write(tmsg);

conn:=true;
while conn do begin

ack_msg:='';
transmit:=true;
msg:=cs1.IOHandler.ReadString(size+12);  //wichtig, bei readstring muss feste länge bekannt sein -> size ist typ const

if ansipos('r:hi',msg)=1 then begin
  ack_msg:='ok';
  conn:=true;
end;

NumberBytes:=length(msg);
memo1.Lines.Add('nachricht empfangen: '+copy(msg,1,min(40,length(msg))) );

 i:=length(ack_msg);
 if (i>0and transmit then begin
  setlength(tmsg,size+12);                            //  
  for x:=1 to size+12 do tmsg[x]:='0';                //damit die ausgehenden Daten immer die selbe Länge haben
  for x:=1 to length(ack_msg) do tmsg[x]:=ack_msg[x]; //
  cs1.IOHandler.Write(tmsg);
 end;

end//while

end;


und der Empfangsteil der Serverkomponente:
ausblenden volle Höhe 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:
procedure TForm1.ss1Execute(AContext: TIdContext);
var msg,tmsg: String;
    numberBytes,i,len: integer;
    conn, transmit: boolean;
begin

conn:=true;

with AContext.Connection.IOHandler do begin

while conn do begin
try

ack_msg:='';
transmit:=true;
msg:=acontext.Connection.IOHandler.ReadString(size+12);  //hier wieder die feste Länge des zu lesenden Strings
memo1.Lines.Add('nachricht empfangen: '+copy(msg,1,min(40,length(msg))) );

if ansipos('hihi',msg)=1 then begin
  ack_msg:='r:hi';
  conn:=true;
end;

i:=length(ack_msg);
if (i>0and transmit then begin
  setlength(tmsg,size+12);
  for x:=1 to size+12 do tmsg[x]:='0';
  for x:=1 to length(ack_msg) do tmsg[x]:=ack_msg[x];
  acontext.Connection.IOHandler.write(tmsg);
end;

except
 conn:=false;
end//try

end//while
end//with Acontext.Connection do

end;


so kann ich jetzt beliebige Daten verschicken und muss nicht Angst haben dass das Standard Beispiel mit ReadLn und WriteLn mir abk***t weil ausversehen ein EOL-Zeichen innerhalb der Daten ist, welches ein Stop des Einlesens auf der Server-Seite verursachen würde.